线程的状态
线程的状态很早之前就理解过了,最近翻《并发编程艺术》的书时候,看到有个点之前理解的不太对。
书中的线程状态分类
- new 初始状态,线程被构建,但是还没有调用start()方法
- runnable 运行状态,java中将操作系统中的就绪和运行两种状态笼统称作”运行中“(这里没有网上常见的Running状态)
- blocked 阻塞状态,表示线程阻塞于锁
- waiting 等待状态,表示线程进入等待状态,进入该状态表示当前线程需要等待其他线程做出一些特定动作(通知或中断)
- time_waiting 超时等待状态,该状态不同于waiting,可以在指定的时间自行返回。(可以看到这里将waiting和time_waiting分开了,这样也很符合我们用jstack命令看到的线程状态信息)
- terminated 终止状态,表示线程已经执行完毕。
一个线程状态演示的例子
在书中有这样的一个例子:
1 | /** |
这里用了jps和jstack命令去观察了线程状态:
1 | // blockedThread-2线程阻塞在获取Blocked.class的锁上 |
书中的状态转换图
- 这里要注意的一点:
阻塞状态是线程阻塞在进入synchronized关键字修饰的方法或者代码块(获取锁)时的状态,但是阻塞在java.concurrent包中Lock接口的线程状态却是等待状态,因为Lock接口对于阻塞的实现均使用了LockSupport类中相关的方法。