这是线程正在等待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后可用。
提前致谢。
答案 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)
我相信Lock
和Condition
更适合您的需要。请检查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
类是更好的方法。