【发布时间】:2012-09-04 12:10:31
【问题描述】:
代码sn-p:
class Counter implements Runnable {
Object s = new Object();
@Override
public void run() {
try {
synchronized (s) {
s.wait(10000);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
//...do Something
}
public void stopCounter() {
synchronized (s) {
s.notifyAll();
}
}
}
无论我是否调用 stopCounter,...do Something 代码总是仅在等待间隔之后执行。即使在通知之后它仍然等待 10 秒。
【问题讨论】:
-
在调用
stopCounter()之前是否更改了变量s? -
由于虚假唤醒,等待的调用几乎总是处于循环中。基本上,当您为同一个对象调用 notify 或 notifyAll 时,wait 总是会返回。但它也可能出于任何原因或根本没有原因返回。所以你需要某种信号(通常是一个易失的布尔变量)和一个循环。每次等待返回时,检查变量,如果它没有达到所需的值,请再次等待。
-
如果您的目标是通常等待 10 秒,但有时会提前唤醒,那么最好使用 Thread.sleep(没有虚假唤醒)和 Thread.interrupt(当您希望睡眠线程醒来)。
-
不,我正在使用相同的计数器实例。
标签: java wait intervals notify