[Java高并发编程]线程的生命周期 以及各状态之间的转换

1. NEW

知识点

  1. 当一个线程处于NEW状态时,他只是一个Thread类的对象,该线程并不存在,与你new 一个普通类对象没有什么区别
  2. 当该对象调用start方法时,进入RUNNABLE状态

2. RUNNABLE

知识点

  1. 该状态的线程拥有被执行的资格,但是并没有被执行,而是在等待CPU的调度.
  2. 因为有RUNNING状态的存在,该线程不会直接进入BLOCKED和TERMINATED状态.

状态切换

  1. CPU调度到该线程并执行该线程,进入RUNNING状态.

3.RUNNING

知识点
一个处于RUNNING状态的线程一定是RUNNABLE的,但反之不成立

状态切换到TERMINATED
调用JDK不推荐使用的stop方法等

状态切换到BLOCKED

  1. 线程执行过程中调用了sleep,wait方法
  2. 由于某个"读写"操作而进入此状态,比如等待某个写入操作
  3. 为了获取某个锁资源,从而加入到该锁的阻塞队列而进入此状态
    ps:阻塞:通常是指一个线程执行过程中暂停,以等待某个条件的触发

状态切换到RUNNABLE

  1. 因为CPU的调度使该线程放弃执行,从而进入此状态
  2. 线程主动掉用yield函数,进入RUNNABLE状态

4. BLOCKED状态

状态切换到TERMINATED

  1. 调用JDK不推荐使用的stop方法,或者意外死亡(JVM Crash)

状态切换到RUNNABLE

  1. 线程阻塞的操作结束,比如某次写操作完成.
  2. 线程完成指定时间的休眠
  3. wait中的线程被notify/notifyall唤醒
  4. 该线程获得了某个锁资源
  5. 线程在阻塞状态过程中被打断,比如其他线程调用了interrupt方法.

5. TERMINATED

知识点
该状态下的线程不会切换到其他任何状态

下列情况线程会进入TERMINATED

  1. 线程正常结束,结束生命周期
  2. 线程运行出错,意外结束
  3. JVM Crash导致所有线程结束

以上知识点参考自 <<Java高并发编程详解>> 汪文君 著 ,百度百科
若有错误还请留言,谢谢!

相关文章:

  • 2021-08-24
  • 2021-12-21
  • 2021-04-22
  • 2022-01-21
  • 2021-04-30
  • 2021-12-18
  • 2021-12-24
  • 2021-08-19
猜你喜欢
  • 2021-06-12
  • 2022-01-02
  • 2021-07-25
  • 2021-05-09
  • 2021-06-03
  • 2021-12-29
  • 2022-01-16
相关资源
相似解决方案