2012-10-21 194 views
5

可能重複:
How do you kill a thread in Java?
How to start/stop/restart a thread in Java?如何停止Java線程?

Thread具有以下功能:

  • destroy()
  • stop()
  • suspend()

,但他們都已過時。
你用什麼來阻止線程?

+0

你不停止一個線程,只是讓'run'方法完成它的執行。 –

+0

您能否詳細說明您的用例,說明您爲什麼要停止線程? – Vikdor

+0

爲了完整性,另一種方法是終止整個過程 - 這將起作用。 –

回答

4

你應該確保它只是運行/退出時,它應該。

檢查this的解釋。

3

您可以使用布爾標誌來停止線程。你也可以利用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

2

你可以做這樣的:

private boolean running = true; 

public void stop() { 
    running = false; 
}  

public void run() { 
    while (running) { 
     //your code goes here 
    } 
} 

這讓遊程的只是一個簡單的方法方法簡單地消失。

+1

+1運行需要'volatile',否則run()可能永遠不會停止。 –

2

你問他禮貌地結束它的工作。該線程應該表現良好,並且在問及時應該結束它的工作。

要求您使用Thread.interrupt(),這將引入InterruptedException(如果線程正在等待)或在線程中設置標誌(如果不等待)。

線程應該在捕獲InterruptException時退出它的工作,或者如果它做了很長時間的工作(沒有睡眠/等待),它應該不時檢查它是否被中斷,如果是,則退出。

0

您提到的方法已被棄用,因爲一旦使用它們可能會使系統處於不穩定狀態:它就像殺死進程一樣。使用這些方法不會給線程任何優雅退出的機會。

結論是,你正在執行的每個線程應該有它自己的優雅退出機制。通常你會做以下事情。創建boolean標誌exit默認爲false。該線程的run()方法應該實現循環,如:

while (!exit) { 
    // do the job 
} 

Add方法exit(),輪流此標誌true,所以當該方法是從外面叫你的線程將離開while循環的下一次迭代。退出時你應該關心關閉資源等。

很明顯,你可以通過發送唱

0

任何線程運行,以完成其工作,完善機制。如果有更多的工作要做,它應該確定自己。當你想停止工作線程時,這意味着線程認爲工作存在,但你不希望線程去做。這在你的設計中肯定是一個問題。在設計良好的問題中,不需要停止/恢復線程。