实现run()的有效方法是什么?

时间:2010-12-21 03:35:31

标签: java multithreading

它是否只包含一个像

while (true) { ... }

这样的循环

我发现它不那么高效,因为它消耗了这么多CPU。我希望我的线程能够继续等待,但是最好的方法是让它等待而不消耗那么多CPU?

3 个答案:

答案 0 :(得分:6)

使用Object.waitObject.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();
    }
}