2015-06-21 57 views
1

我有一個線程正在運行一個模擬,並在邏輯層中迭代動態系統的一個步驟,然後重新繪製GUI以查看屏幕中的結果。爲了讓用戶查看系統如何變化,每次重繪之間都會有一個睡眠,但我也需要暫停仿真以觀察更改,這將停止重新繪製和系統迭代,直到用戶恢復模擬。暫停並恢復正在休眠的線程Java

目前看起來是這樣的:

simulationThread = new Thread(){ 
     @Override 
     public void run(){ 
      for(int i=0; i<iterations; i++){ 
       world.iterate(); 
       try{ 
        Thread.sleep(100); 
       }catch(Exception e){ 
        e.printStackTrace(); 
       } 
       view.repaint(); 
      } 
     } 
    }; 

    simulationThread.start(); 

如何暫停simulationThread並能夠重新恢復它?我試着使用wait()方法,但是當線程睡眠問題等待被調用。我懷疑我應該改變線程的等待方式,直到下一次重新繪製,以便實現暫停/恢復任務,但我不知道如何。

回答

1
class Pauser 
{ 
public: 
    public synchronized void pause() 
    { 
     isPaused = true; 
    } 
    public synchronized void resume() 
    { 
     isPaused = false; 
     notifyAll(); 
    } 
    public synchronized void waitIfPaused() 
    { 
     while(isPaused) 
     { 
      wait(); 
     } 
    } 
private: 
    boolean isPaused; 
}; 

使用.pause()方法暫停仿真,.resume()的簡歷,並.waitIfPaused()你的線程裏面,只要它是安全的暫停。例如,您可以在更改系統參數之前使用.waitIfPaused()

+0

也許還會使得isPaused volatile,以確保它在一段時間內從內存中重新讀取。 – slipperyseal

+1

@SlipperySeal:'volatile'在這裏不需要,因爲編譯器禁止在'wait()'調用周圍重用緩存變量。 – Tsyvarev

+0

很酷。我不知道。 – slipperyseal