執行緒結束方法

2021-09-13 14:28:10 字數 2093 閱讀 8914

執行緒屬於一次性消耗品,在執行完run()方法之後執行緒便會正常結束了,執行緒結束後便會銷毀,不能再次start,只能重新建立新的執行緒物件,但有時run()方法是永遠不會結束的。例如在程式中使用執行緒進行socket監聽請求,或是其他的需要迴圈處理的任務。在這種情況下,一般是將這些任務放在乙個迴圈中,如while迴圈。當需要結束執行緒時,如何退出執行緒呢?

有三種方法可以結束執行緒:

前兩種方法都可以實現執行緒的正常退出;第3種方法相當於電腦斷電關機一樣,是不安全的方法。

一般run()方法執行完,執行緒就會正常結束,然而,常常有些執行緒需要長時間的執行,只有在外部某些條件滿足的情況下,才能關閉這些執行緒。使用乙個變數來控制迴圈,例如:最直接的方法就是設乙個boolean型別的標誌,並通過設定這個標誌為true或false來控制while迴圈是否退出。標誌需要volatile修飾來保證可見性

public class myrunnable implements runnable  catch (interruptedexception e) 

//退出標誌生效位置

while (flag)

system.out.println("第" + thread.currentthread().getname() + "個執行緒終止");

}}

使用interrupt()方法來中斷執行緒有兩種情況:

1.執行緒處於阻塞狀態,如使用了sleep,同步鎖的wait,socket中的receiver,accept等方法時,會使執行緒處於阻塞狀態。當呼叫執行緒的interrupt()方法時,會丟擲interruptexception異常。阻塞中的那個方法丟擲這個異常,通過**捕獲該異常,然後break跳出迴圈狀態,從而讓我們有機會結束這個執行緒的執行。通常很多人認為只要呼叫interrupt方法執行緒就會結束,實際上是錯的, 一定要先捕獲interruptedexception異常之後通過break(或return)來跳出迴圈,才能正常結束run方法。

public class threadsafe extends thread catch(interruptedexception e)}} 

}

2.執行緒未處於阻塞狀態,使用isinterrupted()判斷執行緒的中斷標誌來退出迴圈。當使用interrupt()方法時,中斷標誌就會置true,和使用自定義的標誌來控制迴圈是一樣的道理。

public class threadsafe extends thread 

} }

public class threadsafe extends thread catch(interruptedexception e)}} 

}

public class shutdown 

private static class runner implements runnable catch(interruptedexception e)

}system.out.println("count i = " + i);

}public void cancel()

}}

程式中可以直接使用thread.stop()來強行終止執行緒,但是stop方法是很危險的,就象突然關閉計算機電源,而不是按正常程式關機一樣,可能會產生不可預料的結果,不安全主要是:thread.stop()呼叫之後,建立子執行緒的執行緒就會丟擲threaddeatherror的錯誤,並且會釋放子執行緒所持有的所有鎖。一般任何進行加鎖的**塊,都是為了保護資料的一致性,如果在呼叫thread.stop()後導致了該執行緒所持有的所有鎖的突然釋放(不可控制),那麼被保護資料就有可能呈現不一致性,其他執行緒在使用這些被破壞的資料時,有可能導致一些很奇怪的應用程式錯誤。因此,並不推薦使用stop方法來終止執行緒。

**:

結束執行緒的方法

thread 和 runnable 1 theread是個類。run getname 方法 2 runnable是乙個介面。thread.currentthread getname runnable 建立物件方法 thread acctressthread new thread new actres...

Interrupt方法結束執行緒

4.1.5.3.interrupt 方法結束執行緒使用interrupt 方法來中斷執行緒有兩種情況 1.執行緒處於阻塞狀態 如使用了sleep,同步鎖的wait,socket中的receiver,accept等方法時,會使執行緒處於阻塞狀態。當呼叫執行緒的interrupt 方法時,會丟擲inte...

等待執行緒結束

今天在除錯乙個多執行緒的程式時一直出問題,具體情況是這樣的 我在程式的開始執行乙個執行緒,執行緒一直執行,知道程式結束時才結束,所以我的程式在結束時要等待執行緒結束再結束自己。正在裝載資料 我後來發現了問題,修改後就ok了,我把修改後的大致 帖出 uint ispress lpvoid lppara...