Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Thread.sleep()实现_Java_Multithreading_Concurrency_Thread Sleep - Fatal编程技术网

Java Thread.sleep()实现

Java Thread.sleep()实现,java,multithreading,concurrency,thread-sleep,Java,Multithreading,Concurrency,Thread Sleep,有人能帮我理解Thread.sleep()函数是如何实现的吗?当指定的时间过去或其他线程中断时,线程将恢复/唤醒。我感兴趣的是了解这项工作背后的设计模式 据说睡眠对CPU消耗没有影响。当前线程是否已添加到侦听器列表中?什么时候会出现中断标志检查?调度器是否在每“x”时间段(基于操作系统支持的内容)检查每个休眠线程的中断状态?线程如何在不影响CPU的情况下获得控制权 我已经找过了。对不起,如果我错过了任何链接,很容易找到 有人能帮我理解Thread.sleep()函数是如何实现的吗 它在操作系统提

有人能帮我理解Thread.sleep()函数是如何实现的吗?当指定的时间过去或其他线程中断时,线程将恢复/唤醒。我感兴趣的是了解这项工作背后的设计模式

据说睡眠对CPU消耗没有影响。当前线程是否已添加到侦听器列表中?什么时候会出现中断标志检查?调度器是否在每“x”时间段(基于操作系统支持的内容)检查每个休眠线程的中断状态?线程如何在不影响CPU的情况下获得控制权

我已经找过了。对不起,如果我错过了任何链接,很容易找到

有人能帮我理解Thread.sleep()函数是如何实现的吗

它在操作系统提供的底层本机线程上调用
sleep

据说睡眠对CPU消耗没有影响

未运行的线程不会占用CPU时间

当前线程是否已添加到侦听器列表中

没有

什么时候会出现中断标志检查

线程无法检查中断标志,因为它未运行。如果请求,操作系统可以唤醒线程

调度器是否在每“x”时间段(基于操作系统支持的内容)检查每个休眠线程的中断状态

没有

线程如何在不影响CPU的情况下获得控制权

当时间到期时,操作系统会自动唤醒该线程,或者另一个线程可以要求操作系统提前唤醒它


以下是中Thread.sleep()的一些代码:


它是由操作系统实现的,而不是由Java实现的。你的问题太离题了,谢谢。这击倒了我大部分的误解。我还有一个问题。InterruptedException何时构建?有没有一个回调函数在操作系统报告中断或时间到期时执行?@PranethVarma:当线程唤醒时,它可以检查它被唤醒的原因。我发布了OpenJVM中的C代码,该检查是在OpenJVM中实现的。
 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);