Java 什么';这是实现run()的一种有效方法吗?
它应该只包含像while(true){…}这样的循环吗 while (true) { ... }Java 什么';这是实现run()的一种有效方法吗?,java,multithreading,Java,Multithreading,它应该只包含像while(true){…}这样的循环吗 while (true) { ... } 我发现它没有那么高效,因为它消耗了那么多CPU。我想让我的线程继续等待一些东西,但是让它等待而不消耗这么多CPU的最好方法是什么呢?有很多方法可以有效地使用对象。wait和对象。notify(请参阅),或者使用各种更高级别的Java并发类,如阻塞队列、锁存、未来,信号灯或障碍物 =================================================== 你是对的,反复测试
我发现它没有那么高效,因为它消耗了那么多CPU。我想让我的线程继续等待一些东西,但是让它等待而不消耗这么多CPU的最好方法是什么呢?有很多方法可以有效地使用
对象。wait
和对象。notify
(请参阅),或者使用各种更高级别的Java并发类,如阻塞队列、锁存、未来,信号灯或障碍物
===================================================
你是对的,反复测试条件是一个非常糟糕的主意;e、 g
while (!condition) {
// really bad idea ... burns CPU cycles.
}
以下是一个改进,但仍然可能存在问题:
while (!condition) {
Thread.sleep(...); // bad idea
}
问题是,如果您将睡眠间隔设置得很短,则循环成本会很高。但是,如果将其设置得更长(例如,一秒钟左右),则线程可能会花费相当长的时间来响应条件变为真。最终结果可能是吞吐量降低和/或用户界面迟钝
不幸的是,有时
循环{test;sleep}
方法是最好的选择,但如果可以避免,就应该这样做。不要在(true){}时执行。如果您正在等待某个事件,请执行wait()-notify()
机制。否则,使用sleep(nsecs)
而不是等待,听起来你可以使用这个模式。观察者维护其依赖项的列表,称为Observables,并通知他们任何更改,通常通过调用观察者方法之一
下面是如何创建一个观察者类和一个可观察的类
/** 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()
。相关:很好的综合答案+1.