2011-05-19 198 views
4

如何暫停執行某個線程。我有線程t,並且有兩個按鈕,PAUSE和CONTINUE。在暫停時,我需要暫停執行線程,並繼續從之前停止的線程開始執行線程。什麼放在聽衆?如何暫停執行線程

+1

這可能會幫助 - http://stackoverflow.com/questions/5472868/如何暫停程序,直到按下按鈕/ 5472999#5472999 – mre 2011-05-19 12:23:15

回答

8

Java中的線程是合作的,這意味着你不能強制線程停止或暫停,而是向線程發出你想要的信號和線程(=你的邏輯)自己做的事情。

使用synchronized,wait()和notify()。

  1. 在要停止的線程中創建一個原子標誌(例如布爾型字段)。可停止的線程監視循環中的這個標誌。循環必須在​​區塊內。
  2. 當您需要停止線程(按鈕單擊)時,您設置此標誌。
  3. 線程看到標誌已設置並在公共對象(可能本身)上調用wait()
  4. 當您想重新啓動線程時,重置標誌並致電commonObject.notify()
+2

有道理的第一個答案+1 – 2011-05-19 12:25:59

+0

+1,這是非常正確的解決方案。 – mre 2011-05-19 12:33:14

+0

如果您正在使用原子布爾值來指示線程應該繼續執行還是暫停執行,爲什麼循環需要位於同步塊中? – 2011-05-19 12:58:57

0

我想你可能想看看的wait()和notify()反對java.lang.Object繼承

0

方法有一個等待,等待,你可以調用。等待聽起來更接近你正在尋找的東西。爲什麼你需要暫停執行某個線程?如果除了家庭作業以外,可能還有其他解決方案。

+0

暫停某些線程的執行是一個非常好的,有效的解決方案。我在練習中一直都在使用這個... – mre 2011-05-19 12:27:26

+0

對不起,我並不是想暗示這樣做不好。雖然你必須考慮虛假的喚醒,錯過的信號等。我的意思是,根據爲什麼需要這樣做的原因,可能有更好的解決方案來解決問題。 – 2011-05-19 12:53:08

0

與線程池相同的邏輯。當線程池中,直到它們被調用來執行提交池

+0

問題是關於停止現有線程,而不是關於啓動新線程。線程池與它無關。 – 2011-05-19 12:40:41

+0

當等待被按下等待某個對象時,並且當進行的操作按下時調用notifyAll在同一個對象上。 – Amareswar 2011-05-19 12:49:20

0

你可以試試這個一些行動:

private boolean isPaused = false; 


public synchronized void pause(){ 
    isPaused = true; 
} 

public synchronized void play(){ 
    isPaused = false; 
    notyfyAll(); 
} 

public synchronized void look(){ 
    while(isPaused) 
     wait(); 
} 

public void run(){ 
    while(true){ 
     look(); 
     //your code 
}