线程的状态可以参考JDK中的Thread类中的枚举State,存在六种状态
public enum State {//尚未启动的线程的线程状态NEW,//可运行线程的线程状态RUNNABLE,//线程阻塞等待监视器锁的线程状态BLOCKED,//等待线程的线程状态WAITING,//具有指定等待时间的等待线程的线程状态(有限等待)TIMED_WAITING,//已终止线程的线程状态。线程已完成执行TERMINATED;}public enum State { //尚未启动的线程的线程状态 NEW, //可运行线程的线程状态 RUNNABLE, //线程阻塞等待监视器锁的线程状态 BLOCKED, //等待线程的线程状态 WAITING, //具有指定等待时间的等待线程的线程状态(有限等待) TIMED_WAITING, //已终止线程的线程状态。线程已完成执行 TERMINATED; }public enum State { //尚未启动的线程的线程状态 NEW, //可运行线程的线程状态 RUNNABLE, //线程阻塞等待监视器锁的线程状态 BLOCKED, //等待线程的线程状态 WAITING, //具有指定等待时间的等待线程的线程状态(有限等待) TIMED_WAITING, //已终止线程的线程状态。线程已完成执行 TERMINATED; }
![线程的六种状态 图片[1]-线程的六种状态-不念博客](https://www.bunian.cn/wp-content/uploads/2023/11/640-28.png)
六种状态介绍:
![线程的六种状态 图片[2]-线程的六种状态-不念博客](https://www.bunian.cn/wp-content/uploads/2023/11/640-1-17.png)
新建(NEW)
- 当一个线程对象被创建,但还未调用 start 方法时处于新建状态
- 此时未与操作系统底层线程关联
可运行(RUNNABLE):
- 调用了 start 方法,就会由新建进入可运行
- 此时与底层线程关联,由操作系统调度执行
终结(TERMINATED)
- 线程内代码已经执行完毕,由可运行进入终结
-此时会取消与底层线程关联
阻塞(BLOCKED)
- 当获取锁失败后,由可运行进入 Monitor 的阻塞队列阻塞,此时不占用 cpu 时间
- 当持锁线程释放锁时,会按照一定规则唤醒阻塞队列中的阻塞线程,唤醒后的线程进入可运行状态
等待(WAITING)
- 当获取锁成功后,但由于条件不满足,调用了 wait() 方法,此时从可运行状态释放锁进入 Monitor 等待集合等待,同样不占用 cpu 时间
- 当其它持锁线程调用 notify() 或 notifyAll() 方法,会按照一定规则唤醒等待集合中的等待线程,恢复为可运行状态
有时限等待(TIMED_WAITING)
- 当获取锁成功后,但由于条件不满足,调用了 wait(long) 方法,此时从可运行状态释放锁进入 Monitor 等待集合进行有时限等待,同样不占用 cpu 时间
- 当其它持锁线程调用 notify() 或 notifyAll() 方法,会按照一定规则唤醒等待集合中的有时限等待线程,恢复为可运行状态,并重新去竞争锁
- 如果等待超时,也会从有时限等待状态恢复为可运行状态,并重新去竞争锁
- 还有一种情况是调用 sleep(long) 方法也会从可运行状态进入有时限等待状态,但与 Monitor 无关,不需要主动唤醒,超时时间到自然恢复为可运行状态
其它情况(只需了解)
- 可以用 interrupt() 方法打断等待、有时限等待的线程,让它们恢复为可运行状态
- park,unpark 等方法也可以让线程等待和唤醒
© 版权声明
本站文章由不念博客原创,未经允许严禁转载!
THE END