Java:如何在wait()中区分虚假唤醒和超时

时间:2011-11-18 06:03:34

标签: java multithreading wait

这是线程正在等待notify()或超时的情况。这里添加了一个while循环来处理虚假唤醒。

boolean dosleep = true;
while (dosleep){
    try {
        wait(2000);
        /**
         * Write some code here so that
         * if it is spurious wakeup, go back and sleep.
         * or if it is timeout, get out of the loop. 
         */

    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

在这种情况下,我如何区分虚假唤醒和超时?如果它是一个虚假的醒来,我需要回去等待。如果是超时,我需要退出循环。

我可以轻松识别notify()的情况,因为我会在notify()调用时将dosleep变量设置为false。

编辑:由于嵌入式项目的要求,我使用的是1.4版java。我无法使用Condition,因为它仅在1.5后可用。

提前致谢。

3 个答案:

答案 0 :(得分:6)

你可以这样做:

boolean dosleep = true;
long endTime = System.currentTimeMillis() + 2000;
while (dosleep) {
    try {
        long sleepTime = endTime - System.currentTimeMillis();
        if (sleepTime <= 0) {
            dosleep = false;
            } else {
            wait(sleepTime);
        }
    } catch ...
}

这应该在Java 1.4中正常工作,它将确保你的线程至少睡眠2000毫秒。

答案 1 :(得分:4)

我相信LockCondition更适合您的需要。请检查Condition.awaitUntil()的javadocs - 它有一个使用示例

答案 2 :(得分:4)

如果你想区分这两种情况,你需要跟踪你的超时。

long timeout = 2000;
long timeoutExpires = System.currentTimeMillis() + timeout;
while(dosleep) {
  wait(timeout);
  if(System.currentTimeMillis() >= timeoutExpires) {
    // Get out of loop
    break;
  }
}

也就是说,丹尼斯建议使用Condition类是更好的方法。