Java多线程学习笔记之sleep()

1. sleep的用途、简单用例

使当前线程睡眠指定的时间,哪个线程调用Thread.sleep则哪个线程就会睡眠(谁调用谁休眠)。睡眠的意思:让出cpu的占用时间

Java多线程学习笔记之sleep()


2. sleep注释事项

  • 只针对当前线程,即谁调用sleep()谁就休眠。
  • 睡眠时间并不准确,取决于操作系统的计时器调度器。
  • 线程调用sleep时不会释放锁:在synchronized块里面进行sleep操作,或已获取锁的线程中执行sleep,该线程不会释放锁。与Object.wait方法不同。
  • 其他线程可中断sleep状态的进程,使其抛出InterruptedException异常。

3. sleep的线程不会释放锁

如下代码片段,thread1首先获得了锁,并休眠3秒,此时thread2需要一直等待,直到thread1执行结束,释放锁完毕,thread2才可以获得锁执行。

Java多线程学习笔记之sleep()


4. sleep的线程可被中断

处于sleep状态的线程,是可以被其他线程中断的,sleep状态的线程被中断后报出Interrupt 异常。如下代码thread1线程在休眠状态时,被thread2中断。

Java多线程学习笔记之sleep()


5. sleep(0)的用途

sleep(0)的作用,其实就是让当前线程让出该轮cpu时间,这样其他线程就有更大的概率获取到cpu的轮转机会。

如下代码,主线程循环100次,而子线程由于执行了多次Thread.sleep(0),这是cpu的执行大多会被主线程占用,因此主线程打印100次输出信息,而子线程确只打印了几次很少的输出信息。

Java多线程学习笔记之sleep()

 


 

6. 线程运行状态的转换

线程在运行状态中,会有多种不同的状态,不同状态之间会相互转换,如下图所示,线程的多种状态流转图

Java多线程学习笔记之sleep()


7. 参考链接

声明:本文内容,主要是根据下述文章进行整理,作为学习笔记

https://learning.snssdk.com/feoffline/toutiao_wallet_bundles/toutiao_learning_wap/online/article.html?item_id=6773451116911788548&app_name=news_article