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会不断地循环去检测中断状态(是为中断则抛出中断异常),并且根据设置的休眠时间和已经过去的时间进行计算,未到休眠时间则挂起,超出休眠时间则退出。
感谢各位的阅读,如果有不正确的地方,欢迎评论指正。