Java多线程学习笔记之sleep()
1. sleep的用途、简单用例
使当前线程睡眠指定的时间,哪个线程调用Thread.sleep则哪个线程就会睡眠(谁调用谁休眠)。睡眠的意思:让出cpu的占用时间
2. sleep注释事项
- 只针对当前线程,即谁调用sleep()谁就休眠。
- 睡眠时间并不准确,取决于操作系统的计时器和调度器。
- 线程调用sleep时不会释放锁:在synchronized块里面进行sleep操作,或已获取锁的线程中执行sleep,该线程不会释放锁。与Object.wait方法不同。
- 其他线程可中断sleep状态的进程,使其抛出InterruptedException异常。
3. sleep的线程不会释放锁
如下代码片段,thread1首先获得了锁,并休眠3秒,此时thread2需要一直等待,直到thread1执行结束,释放锁完毕,thread2才可以获得锁执行。
4. sleep的线程可被中断
处于sleep状态的线程,是可以被其他线程中断的,sleep状态的线程被中断后报出Interrupt 异常。如下代码thread1线程在休眠状态时,被thread2中断。
5. sleep(0)的用途
sleep(0)的作用,其实就是让当前线程让出该轮cpu时间,这样其他线程就有更大的概率获取到cpu的轮转机会。
如下代码,主线程循环100次,而子线程由于执行了多次Thread.sleep(0),这是cpu的执行大多会被主线程占用,因此主线程打印100次输出信息,而子线程确只打印了几次很少的输出信息。
6. 线程运行状态的转换
线程在运行状态中,会有多种不同的状态,不同状态之间会相互转换,如下图所示,线程的多种状态流转图
7. 参考链接
声明:本文内容,主要是根据下述文章进行整理,作为学习笔记