2012-07-04 48 views
0

所以這是我的問題,我怎樣才能使線程停止,我不是線程很精通,但我看了一些信息告訴我,這應該工作。我怎樣才能讓這個線程停止

public class testestes { 
    static volatile boolean key; 

    public static void main (String []args) 
    { 
     key=true; 
     Thread thread=new Thread(new Runnable() 
     { 
      public void run() 
      { 
       while(key) 
       { 
        System.out.println("running"); 
       } 
      } 
     }); 

     thread.start(); 
     key=false; 
    } 
} 
+0

我試過你的代碼,它停下來。 –

+0

我也不明白,一旦調用'run()'變爲'start()',新線程運行,當鍵設置爲false時,新**線程停止**。該代碼適用於我。問題必須出現在此處未發佈的代碼中。 –

回答

2

不會使用boolean檢查線是否應終止。如果您使用volatile作爲現場修改,這將工作可靠,但如果你的代碼變得更加複雜,對於而是使用while環內的其他阻止方法,它可能發生,你的代碼將不是在所有或至少終止你可能需要更長的需要更長的時間

某些阻斷庫方法支持中斷。

每個線程都有一個布爾標誌中斷狀態你應該利用它。它可以這樣實現:

public void run() { 

    try { 
     while(!Thread.currentThread().isInterrupted()) { 
     // ... 
     } 
    } catch (InterruptedException consumed) 
     /* Allow thread to exit */ 
    } 

} 

public void cancel() { interrupt(); } 

源代碼取自Java Concurrency in Practice。由於cancel()方法是公開的,因此您可以讓另一個線程根據需要調用此方法。

還有一個命名不清的靜態方法interrupted,它清除當前線程的中斷狀態。

+1

我最終使用這種解決方案,雖然這不是我最初的問題的答案,這是我的問題的實際答案,它似乎是最好的選擇。 (我發誓,在我的電腦中,代碼片段並沒有停止,我仍然不知道爲什麼)。 – crusader

1

您想致電thread.start();而不是thread.run();。 run()不會分叉。

此外,它可能會是,你不會看到任何「跑」的輸出,因爲你馬上設置key爲false,叉所以當分叉線程進入後run()key已經是虛假的情況。

+0

我的問題是,我無法停止輸出顯示,我想停止線程不讓它運行。 – crusader

+0

@crusader當你調用'thread.start()'而不是'thread.run()'時,你不能停止輸出顯示? –

+0

如果你想停止整個事情(JVM),你可以調用System.exit,但我不確定這是否是你想要的解決方案。 – Joset

0

這樣做的基本佈局實際上是一個實現Runnable的類。

public class SampleThread implements Runnable 
{ 
    private volatile boolean stopFlag = false; 

    public void stopThisThread() 
    { 
    stopFlag = true; 
    } 

    public void run() 
    { 
    while (!stopFlag) 
    { 
     //doStuff 
    } 
    } 
} 

然後在其他地方

SampleThread sample = new SampleThread(); 
new Thread(sample).start(); 
//Then when you want to kill it... 
sample.stopThisThread(); 
0

該技術在簡化代碼應該工作造成。我至少可以確認它可以在我的桌面上運行。您是否在本地測試過簡化版本?也許在你的實際版本中有一些東西沒有在這裏表現出來,比如使用非靜態變量或必須滿足的附加條件。

0

我相信你可能想看看與Thread.interrupt()中斷線程。在Java教程中有一篇關於它的好文章。

提示有布爾標誌的答案是同樣正確。無論哪種情況,你都要檢查某個條件語句,看看你的線程是否應該終止。終止的條件可能是線程被中斷或其布爾標誌被設置(取決於您選擇的實現)。

警告的最後一句話:永遠不要使用Thread.stop()。它有一個很好的理由被棄用。請參閱here以獲得很好的解釋。