2010-12-21 123 views
2

它應該只包含一個像什麼是實現run()的好方法?

while (true) { ... }

這樣的循環我覺得它不是那麼有效,因爲它消耗CPU太多。我希望我的線程能夠繼續等待某些東西,但是如果不消耗太多的CPU,最好的方法是什麼?

+1

如果您想等待,請使用'wait()'。 – 2010-12-21 03:38:52

+0

相關:http://stackoverflow.com/questions/1036754/difference-between-wait-and-sleep – 2010-12-21 03:52:12

回答

6

有使用高效Object.waitObject.notify(見here),或使用各種更高級別的Java併發類,如阻塞隊列,龍頭,期貨,信號燈或障礙很多方法可以做到這一點。

============================================== =====

你是正確的,反覆測試的條件是一個非常糟糕的主意;例如

while (!condition) { 
     // really bad idea ... burns CPU cycles. 
    } 

下面是一個進步,但仍可能會出現問題:

while (!condition) { 
     Thread.sleep(...); // bad idea 
    } 

的問題是,如果你設置了睡眠間隔短的循環變得昂貴。但是如果你設置的時間更長(例如,一秒鐘左右),那麼線程可能花費這段時間來響應條件成爲真實。最終的結果可能是吞吐量降低和/或用戶界面緩慢。

不幸的是,有時loop{test; sleep}的方法是最好的選擇,但如果你可以避免它,你應該。

+0

很好的綜合答案! +1 – fastcodejava 2010-12-21 04:34:13

1

不要做while(true) {}。如果您正在等待某個事件,請執行wait()-notify()機制。否則,請使用sleep(nsecs)

0

而不是等待一些東西,聽起來好像你可以使用Observer模式。 Observer維護一個名爲Observables的依賴項列表,並通常通過調用其中一個Observer方法來通知它們所做的任何更改。

下面是你將如何code觀察者類和Observable類。

/** The Observer normally maintains a view on the data */ 
class MyView implements Observer { 
    /** For now, we just print the fact that we got notified. */ 
    public void update(Observable obs, Object x) { 
     System.out.println("update(" + obs + "," + x + ");"); 
    } 
} 

/** The Observable normally maintains the data */ 
class MyModel extends Observable { 
    public void changeSomething() { 
     // Notify observers of change 
     setChanged(); 
     notifyObservers(); 
    } 
} 
相關問題