首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java Object.wait(long)它是如何自我唤醒的?

Java Object.wait(long)它是如何自我唤醒的?
EN

Stack Overflow用户
提问于 2021-04-27 20:06:15
回答 2查看 37关注 0票数 0

示例:

代码语言:javascript
复制
public static void main(String[] args) throws InterruptedException {
    synchronized (lock) {
        for (; ; ) {
            System.out.println("每5秒打印一次");
            lock.wait(5000);
        }
    }
}

只有一个单线程循环等待几秒钟并唤醒打印信息,没有其他线程调用通知,它是如何自动唤醒自己的?

EN

回答 2

Stack Overflow用户

发布于 2021-04-27 20:17:38

你认为5000在那里是什么意思?

lock.wait(5000)的意思是:启动一个计时器,等待以下3种情况中的任何一种发生first

  • 如果5000毫秒(5秒)过去,则正常退出此方法。
  • 如果有人在lock引用的同一对象上调用notifyAll() (或notify),则正常退出此方法。
  • 如果有人在此线程上调用.interrupt(),则通过引发InterruptedException.

退出

因此,如果没有人调用notify,那么这将等待5秒。这只是一种愚蠢的编写Thread.sleep(5000)的方式。

票数 2
EN

Stack Overflow用户

发布于 2021-04-27 20:18:47

有一个调度器,它的任务是运行线程。调度程序知道线程,以及它们当前是否可运行。它大概有一个等待计时器到期的对象队列。这些线程不能“立即”运行,但当它们的时间用完后,它们就可以运行了。

这是与大多数操作系统中相同的原则。执行“睡眠N秒”系统调用。有一些东西可以让线程再次运行。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67282746

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档