2010-07-19 73 views
2

我想寫一個程序2類,一個控制器和一個類,做了很多的計算。控制器創建另一個類的幾個實例,然後告訴他們所有人開始他們的計算(並行)。它們在完成時返回,並且控制器恢復,然後一段時間後,控制器將新數據傳遞給它們,並讓它們再次運行計算。
理想情況下,我可以用參數調用start(),但這是不可能的,所以控制器調用計算器中的一個方法,將數據存儲在全局中,然後啓動計算線程並返回,直到我嘗試再次啓動線程,並且它告訴我線程已經死亡。所以我試圖讓運行成爲一個無限循環,只等待它被通知,運行計算,將結果存儲在全局中,以便控制器可以稍後檢索它們,然後繼續等待。因此,像:new to multithreading-如何在java中使用wait()和notify()?

//in controller: 
Calculator calc=new Calculator(); 
calc.runCalculations(data); 
while(calc.isCalculating()){ 
    //do nothing 
} 
System.out.println("results: "+calc.getAnswer()); 
calc.runCalculations(data2); 

//in calculator: 
public runCalculations(Data data){ 
    globalData=data; 
    this.notify(); 
} 
public void run(){ 
    while(true){ 
     synchronized(this){ 
      wait(); 
     } 
     calculating=true; 
     globalData=calculate(globalData); 
     calculating=false; 
    } 
} 

回答

4

您需要獲得this監視器調用notify()之前。 此外,當您撥打wait()時,您應該在循環中檢查條件以確保您沒有發生虛假喚醒。

public runCalculations(Data data){ 
    globalData=data; 
    synchronized(this) { 
     calculating=true; 
     this.notify(); 
    } 
} 
public void run(){ 
    while(true){ 
     synchronized(this){ 
      calculating=false; 
      while(!calculating) { 
       wait(); 
      } 
     } 
     globalData=calculate(globalData); 
    } 
} 

一般情況下,大多數人會建議不要使用等待/通知,而是建議你使用的執行人,或至少是一個BlockingQueue的。但這兩者都需要你重新設計你目前的想法。

+4

讓我與大多數人一起,建議不要使用低級線程同步原語,而是使用併發包。至少看看BlockingQueue看看你是否喜歡它。 – Thilo 2010-07-19 04:28:42

相關問題