它應該只包含一個像什麼是實現run()的好方法?
while (true) { ... }
這樣的循環我覺得它不是那麼有效,因爲它消耗CPU太多。我希望我的線程能夠繼續等待某些東西,但是如果不消耗太多的CPU,最好的方法是什麼?
它應該只包含一個像什麼是實現run()的好方法?
while (true) { ... }
這樣的循環我覺得它不是那麼有效,因爲它消耗CPU太多。我希望我的線程能夠繼續等待某些東西,但是如果不消耗太多的CPU,最好的方法是什麼?
有使用高效Object.wait
和Object.notify
(見here),或使用各種更高級別的Java併發類,如阻塞隊列,龍頭,期貨,信號燈或障礙很多方法可以做到這一點。
============================================== =====
你是正確的,反覆測試的條件是一個非常糟糕的主意;例如
while (!condition) {
// really bad idea ... burns CPU cycles.
}
下面是一個進步,但仍可能會出現問題:
while (!condition) {
Thread.sleep(...); // bad idea
}
的問題是,如果你設置了睡眠間隔短的循環變得昂貴。但是如果你設置的時間更長(例如,一秒鐘左右),那麼線程可能花費這段時間來響應條件成爲真實。最終的結果可能是吞吐量降低和/或用戶界面緩慢。
不幸的是,有時loop{test; sleep}
的方法是最好的選擇,但如果你可以避免它,你應該。
很好的綜合答案! +1 – fastcodejava 2010-12-21 04:34:13
不要做while(true) {}
。如果您正在等待某個事件,請執行wait()-notify()
機制。否則,請使用sleep(nsecs)
。
而不是等待一些東西,聽起來好像你可以使用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();
}
}
如果您想等待,請使用'wait()'。 – 2010-12-21 03:38:52
相關:http://stackoverflow.com/questions/1036754/difference-between-wait-and-sleep – 2010-12-21 03:52:12