Java 什么';这是实现run()的一种有效方法吗?

Java 什么';这是实现run()的一种有效方法吗?,java,multithreading,Java,Multithreading,它应该只包含像while(true){…}这样的循环吗 while (true) { ... } 我发现它没有那么高效,因为它消耗了那么多CPU。我想让我的线程继续等待一些东西,但是让它等待而不消耗这么多CPU的最好方法是什么呢?有很多方法可以有效地使用对象。wait和对象。notify(请参阅),或者使用各种更高级别的Java并发类,如阻塞队列、锁存、未来,信号灯或障碍物 =================================================== 你是对的,反复测试

它应该只包含像while(true){…}这样的循环吗

while (true) { ... }
我发现它没有那么高效,因为它消耗了那么多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.