Thread.sleep()概述
程序员文章站
2022-07-14 16:16:25
...
sleep
Thread.sleep()被用来暂停当前线程的执行,会通知线程调度器把当前线程在指定的时间周期内置为wait状态。当wait时间结束,线程状态重新变为Runnable并等待CPU的再次调度执行。所以线程sleep的实际时间取决于线程调度器,而这是由操作系统来完成的。
一个进程在运行态时调用sleep(),进入等待态,睡眠结束以后,并不是直接回到运行态,而是进入就绪队列,要等到其他进程放弃时间片后才能重新进入运行态。所以sleep(1000),在1000ms以后,线程不一定会被唤醒。sleep(0)可以看成一个运行态的进程产生一个中断,由运行态直接转入就绪态。这样做是给其他就绪态进程使用时间片的机会。总之,还是操作系统中运行态、就绪态和等待态相互转化的问题。
功能介绍:
让当前线程由运行状态进入到阻塞状态,进而使其他线程有机会继续执行任务。虽然使线程休眠,但是并不释放对象锁,所以说如果在同步块中使用sleep(),其他线程仍然无法获得执行权限。
注意:sleep()方法定义在Thread类中,会调用sleep(millis)这个本地方法,抛出InterruptedException异常,因此需要捕获该异常
Thread sleep(long millis)
暂停当前线程的执行,暂停时间由方法参数指定,单位为毫秒。
注意参数不能为负数,否则程序将会抛出IllegalArgumentException。
Thread sleep(long millis, int nanos)
暂停当前线程的执行,暂停时间为millis毫秒数加上nanos纳秒数。
纳秒允许的取值范围为0~999999.
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
总结
- 它只用于暂停当前线程的执行。
- 线程被wake up并开始执行的实际时间取决于操作系统的CPU时间片长度及调度策略。对于相对空闲的系统来说,sleep的实际时间与指定的sleep时间相近,但对于操作繁忙的系统,这个时间将会显得略长一些。
3.其他的任意线程都能中断当前sleep的线程,并会抛出InterruptedException。
4.sleep()是Thread类的Static(静态)的方法,因此他不能改变对象的机锁,所以当在一个Synchronized块中调用Sleep()方法是,线程虽然休眠了,但是对象的机锁并木有被释放,其他线程无法访问这个对象(即使睡着也持有对象锁)。
5.在sleep()休眠时间期满后,该线程不一定会立即执行,这是因为其它线程可能正在运行而且没有被调度为放弃执行,除非此线程具有更高的优先级。
上一篇: Java NIO使用及原理分析(二)