线程方法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会不断地循环去检测中断状态(是为中断则抛出中断异常),并且根据设置的休眠时间和已经过去的时间进行计算,未到休眠时间则挂起,超出休眠时间则退出。

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

  • 16
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 21
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值