可能重複:
How do you kill a thread in Java?
How to start/stop/restart a thread in Java?如何停止Java線程?
Thread
具有以下功能:
destroy()
stop()
suspend()
,但他們都已過時。
你用什麼來阻止線程?
可能重複:
How do you kill a thread in Java?
How to start/stop/restart a thread in Java?如何停止Java線程?
Thread
具有以下功能:
destroy()
stop()
suspend()
,但他們都已過時。
你用什麼來阻止線程?
你應該確保它只是運行/退出時,它應該。
檢查this的解釋。
您可以使用布爾標誌來停止線程。你也可以利用Thread.isInterrupted()來檢查線程是否被中斷,忽略與布爾標誌相同的工作。
class Worker implements Runnable {
private volatile boolean shouldRun = true;
@Override
public void run() {
while (shouldRun) {
// your code here
}
}
public void cancel()
{
shouldRun = false;
}
}
如果你婉知道爲什麼這些功能已被棄用,你可以檢查Java Thread Primitive Deprecation
你可以做這樣的:
private boolean running = true;
public void stop() {
running = false;
}
public void run() {
while (running) {
//your code goes here
}
}
這讓遊程的只是一個簡單的方法方法簡單地消失。
+1運行需要'volatile',否則run()可能永遠不會停止。 –
你問他禮貌地結束它的工作。該線程應該表現良好,並且在問及時應該結束它的工作。
要求您使用Thread.interrupt()
,這將引入InterruptedException
(如果線程正在等待)或在線程中設置標誌(如果不等待)。
線程應該在捕獲InterruptException
時退出它的工作,或者如果它做了很長時間的工作(沒有睡眠/等待),它應該不時檢查它是否被中斷,如果是,則退出。
您提到的方法已被棄用,因爲一旦使用它們可能會使系統處於不穩定狀態:它就像殺死進程一樣。使用這些方法不會給線程任何優雅退出的機會。
結論是,你正在執行的每個線程應該有它自己的優雅退出機制。通常你會做以下事情。創建boolean
標誌exit
默認爲false
。該線程的run()
方法應該實現循環,如:
while (!exit) {
// do the job
}
Add方法exit()
,輪流此標誌true
,所以當該方法是從外面叫你的線程將離開while
循環的下一次迭代。退出時你應該關心關閉資源等。
很明顯,你可以通過發送唱
任何線程運行,以完成其工作,完善機制。如果有更多的工作要做,它應該確定自己。當你想停止工作線程時,這意味着線程認爲工作存在,但你不希望線程去做。這在你的設計中肯定是一個問題。在設計良好的問題中,不需要停止/恢復線程。
你不停止一個線程,只是讓'run'方法完成它的執行。 –
您能否詳細說明您的用例,說明您爲什麼要停止線程? – Vikdor
爲了完整性,另一種方法是終止整個過程 - 這將起作用。 –