它是否只包含一个像
while (true) { ... }
这样的循环
我发现它不那么高效,因为它消耗了这么多CPU。我希望我的线程能够继续等待,但是最好的方法是让它等待而不消耗那么多CPU?
答案 0 :(得分:6)
使用Object.wait
和Object.notify
(请参阅here)或使用各种更高级别的Java并发类(如阻塞队列,锁存器,期货,信号量),有很多方法可以有效地执行此操作或障碍。
=============================================== ====
你是正确的,反复测试这个条件是一个非常糟糕的主意; e.g。
while (!condition) {
// really bad idea ... burns CPU cycles.
}
以下是一项改进,但仍有问题:
while (!condition) {
Thread.sleep(...); // bad idea
}
问题在于,如果将睡眠间隔设置得很短,则循环变得昂贵。但是如果你把它设置得更长(例如一秒左右),那么线程可能会花费那么长的时间来响应条件变为真。最终结果可以是降低吞吐量和/或缓慢的用户界面。
有时,loop{test; sleep}
方法是最好的选择,但不幸的是,如果你可以避免它,你应该这样做。
答案 1 :(得分:1)
不要while(true) {}
。如果您正在等待某个事件,请执行wait()-notify()
机制。否则,请使用sleep(nsecs)
。
答案 2 :(得分:0)
听起来你可以使用Observer模式,而不是等待某事。 Observer维护一个名为Observables的依赖项列表,并通常通过调用Observer方法之一来通知它们任何更改。
以下是code Observer类和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();
}
}