当前位置: 首页 > 面试题库 >

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

秦鸿羽
2023-03-14
问题内容

这是线程正在等待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后可用。

提前致谢。


问题答案:

如果要区分这两种情况,则需要保持超时。

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

也就是说,丹尼斯建议使用Condition该类是执行此操作的更好方法。



 类似资料:
  • 问题内容: 看到各种与锁定相关的问题,并且(几乎)总是发现“由于虚假唤醒而引起的循环” 1我想知道,有人经历过这种唤醒(例如,假设硬件/软件环境不错)吗? 我知道“虚假”一词没有明显的原因,但是发生此类事件的原因可能是什么? (1注意:我不是在问循环练习。) 编辑:一个帮助器问题(对于那些喜欢代码示例的人): 如果我有以下程序,并且运行它: 我该怎么做才能虚假地唤醒它,而不必永远等待随机事件? 问

  • 问题内容: 哈罗我已经整天调试了我的代码,但是我看不出哪里出了问题。 我在主线程上使用SerialPortEventListener,在工作线程中,我有一个客户端套接字与服务器通信。由于到达此工作线程之后,我仍然需要在主线程中完成一些总结工作,因此我想创建一个“伪线程”,在主线程中等待,直到从侦听器onEvent方法通知它为止。 但是这个伪线程似乎一直在等待。 我检查了锁定的线程,它们在Runna

  • 问题内容: Java的Object.wait()警告“虚假唤醒”,但C#的Monitor.wait()似乎根本没有提及。 了解Mono是如何在Linux之上实现的,并且Linux具有虚假的唤醒功能,难道不应该在某个地方对此进行记录吗? 问题答案: Joe Duffy的“Windows并行编程”中提到了这一点(P311-312,P598)。这一点很有趣: 请注意,在以上所有示例中,线程必须对所谓的虚

  • 本文向大家介绍HTML5如何唤醒APP?相关面试题,主要包含被问及HTML5如何唤醒APP?时的应答技巧和注意事项,需要的朋友参考一下 有以下几种方式 URL Scheme:最常见 Intent: // :Android Universal Link : iOS, 通过传统的 HTTP 链接即可打开 APP 唤醒途径 iframe的src a标签的src window.location 参考资料:

  • 下面我们来看看睡眠和醒来的基本模型。假设有两个系统调用作为睡眠和唤醒。呼叫睡眠的过程将被阻止,而调用的过程将被唤醒。 有一个叫做生产者消费者问题的流行例子,它是模拟睡眠和唤醒机制的最流行的问题。 睡眠和觉醒的概念非常简单。如果关键部分不是空的,那么该过程将进入休眠状态。它将被临界区内正在执行的其他进程唤醒,以便进程可以进入临界区。 在生产者消费者问题中,让我们说有两个过程,一个过程写某事,而另一个

  • 问题内容: 我正在用C++编写程序。我注意到,它获得了许多线程,它们的目的是定期执行某项操作,其中有3或4个线程。我决定通过编写一个调度程序服务来重构,以便使用这些线程的其他地方可以预订该服务,这应该将我随时运行的额外事件线程的数量减少到一个。 我还没有使用此代码的代码。在开始编写之前,我想知道是否有可能,并获得有关我的设计的一些反馈。我要完成的任务的简要说明是这样的: 添加事件 呼叫者提供事件和