栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

线程方法sleep源码分析

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

线程方法sleep源码分析

Thread.sleep方法能让线程进行休眠;那么本章就来探究一下sleep方法源码。

Thread.sleep方法有两个重载的方法,sleep(毫秒),sleep(毫秒,纳秒),但最终都是调用了sleep方法,此方法是native的;对应c++中jvm.cpp的JVM_Sleep方法(图1-1)。

 (图1-1)

在JVM_Sleep方法中(图1-2),

1.首先进行传入的参数校验,如果休眠时间小于0则抛出异常;

2.如果当前线程为中断状态,抛出中断异常,可在catch中捕获;

3.这里参数有两种情况:

sleep(0):也就是传参为0的情况,那么根据ConvertSleepToYield(默认为true),实际上调用了操作系统的yield方法(图1-3);也就是说sleep(0)实际上就是yield。(yield方法表示愿意让出cpu执行权)

sleep(timeout):timeout>0的情况,直接调用了操作系统的sleep方法,继续跟入...

  (图1-2)

(图1-3)

在操作系统的sleep方法中,

首先检查线程是否为可中断的:

是,则开始死循环,判断是否为中断状态,是则直接返回OS_INTRPT,在外层根据这个标识直接抛出中断异常;不是中断,以系统时间与传入的休眠时间进行计算,如果休眠时间到了,则直接退出循环,否则就进行park(timeout)挂起一段时间,醒来后继续判断是否中断和休眠时间计算;直至结束。(图1-4)

否,也是开始死循环,和上面不同的只是少了判断是否中断的情况。(图1-5)

 

(图1-4)

 (图1-5)

至此,sleep方法结束;

总结:

sleep(0)默认情况下是直调用yield方法(yield方法表示愿意让出cpu执行权);或是直接调用操作系统休眠方法。

其余情况,也就是说sleep会不断地循环去检测中断状态(是为中断则抛出中断异常),并且根据设置的休眠时间和已经过去的时间进行计算,未到休眠时间则挂起,超出休眠时间则退出。

感谢各位的阅读,如果有不正确的地方,欢迎评论指正。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/999156.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号