有人可以帮我理解 Thread.sleep() 函数是如何实现的吗?当指定的时间过去或其他一些线程中断时,线程恢复/唤醒。我有兴趣了解其工作背后的设计模式。
据说睡眠对 CPU 消耗没有影响。当前线程是否已添加到侦听器列表中?何时检查中断标志?调度程序是否继续检查每个“x”时间休眠的每个线程的中断状态(基于操作系统支持的内容)?线程如何在不影响 CPU 的情况下获得控制权。
我已经搜索过了。抱歉,如果我错过了任何容易找到的链接。
有人可以帮我理解 Thread.sleep() 函数是如何实现的吗?当指定的时间过去或其他一些线程中断时,线程恢复/唤醒。我有兴趣了解其工作背后的设计模式。
据说睡眠对 CPU 消耗没有影响。当前线程是否已添加到侦听器列表中?何时检查中断标志?调度程序是否继续检查每个“x”时间休眠的每个线程的中断状态(基于操作系统支持的内容)?线程如何在不影响 CPU 的情况下获得控制权。
我已经搜索过了。抱歉,如果我错过了任何容易找到的链接。
有人可以帮我理解 Thread.sleep() 函数是如何实现的吗?
它调用sleep
操作系统提供的底层本地线程。
据说睡眠对 CPU 消耗没有影响。
未运行的线程不会消耗 CPU 时间。
当前线程是否已添加到侦听器列表中?
不。
何时检查中断标志?
线程无法检查中断标志,因为它没有运行。如果请求,操作系统可以唤醒线程。
调度程序是否继续检查每个“x”时间休眠的每个线程的中断状态(基于操作系统支持的内容)?
不。
线程如何在不影响 CPU 的情况下获得控制权。
该线程在时间到期时被操作系统自动唤醒,或者另一个线程可以请求操作系统提前唤醒它。
以下是OpenJVM中 Thread.sleep() 背后的一些代码:
2811 ThreadState old_state = thread->osthread()->get_state();
2812 thread->osthread()->set_state(SLEEPING);
2813 if (os::sleep(thread, millis, true) == OS_INTRPT) {
2814 // An asynchronous exception (e.g., ThreadDeathException) could have been thrown on
2815 // us while we were sleeping. We do not overwrite those.
2816 if (!HAS_PENDING_EXCEPTION) {
2817 HS_DTRACE_PROBE1(hotspot, thread__sleep__end,1);
2818 // TODO-FIXME: THROW_MSG returns which means we will not call set_state()
2819 // to properly restore the thread state. That's likely wrong.
2820 THROW_MSG(vmSymbols::java_lang_InterruptedException(), "sleep interrupted");
2821 }
2822 }
2823 thread->osthread()->set_state(old_state);