1. NEW
知识点
- 当一个线程处于NEW状态时,他只是一个Thread类的对象,该线程并不存在,与你new 一个普通类对象没有什么区别
- 当该对象调用start方法时,进入RUNNABLE状态
2. RUNNABLE
知识点
- 该状态的线程拥有被执行的资格,但是并没有被执行,而是在等待CPU的调度.
- 因为有RUNNING状态的存在,该线程不会直接进入BLOCKED和TERMINATED状态.
状态切换
- CPU调度到该线程并执行该线程,进入RUNNING状态.
3.RUNNING
知识点
一个处于RUNNING状态的线程一定是RUNNABLE的,但反之不成立
状态切换到TERMINATED
调用JDK不推荐使用的stop方法等
状态切换到BLOCKED
- 线程执行过程中调用了sleep,wait方法
- 由于某个"读写"操作而进入此状态,比如等待某个写入操作
- 为了获取某个锁资源,从而加入到该锁的阻塞队列而进入此状态
ps:阻塞:通常是指一个线程执行过程中暂停,以等待某个条件的触发
状态切换到RUNNABLE
- 因为CPU的调度使该线程放弃执行,从而进入此状态
- 线程主动掉用yield函数,进入RUNNABLE状态
4. BLOCKED状态
状态切换到TERMINATED
- 调用JDK不推荐使用的stop方法,或者意外死亡(JVM Crash)
状态切换到RUNNABLE
- 线程阻塞的操作结束,比如某次写操作完成.
- 线程完成指定时间的休眠
- wait中的线程被notify/notifyall唤醒
- 该线程获得了某个锁资源
- 线程在阻塞状态过程中被打断,比如其他线程调用了interrupt方法.
5. TERMINATED
知识点
该状态下的线程不会切换到其他任何状态
下列情况线程会进入TERMINATED
- 线程正常结束,结束生命周期
- 线程运行出错,意外结束
- JVM Crash导致所有线程结束
以上知识点参考自 <<Java高并发编程详解>> 汪文君 著 ,百度百科
若有错误还请留言,谢谢!