Java多线程状态总结!
分类:
架构设计
保留所有版权,请引用而不是转载本文(原文地址 https://yeecode.top/blog/142/ )。
搞定线程,第一步得把"线程到底有哪几种状态、怎么切换"弄清楚。Java 里线程一共五种状态。
- 新建(New):刚 new 出来的线程处于这个状态,此时线程有自己的内存空间。被触发后进入可运行状态。
- 可运行(Runnable):具备了运行条件,正等着 CPU 资源。拿到 CPU 后,转入运行中状态。
- 运行中(Running):占着 CPU,正在处理线程内的任务。可能因为任务结束转入结束状态;也可能因为等用户输入、等锁、等其他线程结束而进入阻塞状态。
- 阻塞(Blocked):释放了 CPU,要等某些条件满足后才能重新拿到 CPU。阻塞又能细分为三种子状态:
- 等待阻塞:对锁对象执行等待方法后,持有锁的线程会进入等待阻塞,直到等待时间到或被重新唤醒,才会进入同步阻塞;
- 同步阻塞:需要拿到同步锁,才能进入可运行状态;
- 其他阻塞:需要等用户输入、等其他线程执行结束等,之后转入可运行状态。
- 结束(Dead):线程已经执行结束。
图 1给出了线程的状态转换图,并标出了状态转换对应的 Java 操作(图中 t 表示线程对象,Thread 表示线程类,o 代表对象)。

上面这些状态里,只有处在"运行中"的线程才占 CPU。某个线程一旦阻塞,CPU 就腾出来给别的线程,既提升了 CPU 利用率,也就提升了程序的整体效率。每个线程还有个优先级属性:优先级高的线程拿到 CPU 的概率更大,但低优先级的线程也不是完全没机会。
在 AI 编程越来越普及的今天,并发与多线程这些"底层硬功夫"并不会被取代,反而是写好高性能程序绕不开的内功。聊完 Java 线程的状态与转换,如果你觉得架构、并发这些话题有意思,强烈推荐一本书《高性能架构之道(第二版)》。
这是一本理论联系实际的架构书,系统讲了怎么从顶层把软件架构好:覆盖分布式、并发编程、数据库调优、缓存、IO、高可用、前端性能优化等众多知识,最后还拿一个真实项目完整走了一遍架构全过程,把书里的方法真正落了地。
这本书还在台湾地区出了繁体版,叫《巨型服务架构》——繁体版嘛,贵得有点离谱。
就先聊到这儿。
我是软件架构师易哥。可以关注我,我会偶尔冒个泡,分享点编程干货!
可以访问个人知乎阅读更多文章:易哥(https://www.zhihu.com/people/yeecode),欢迎关注。
