使用版本为Java8
Java的6种线程状态
Java线程状态定义于java.lang.Thread.State
,共6种状态:
状态定义 | 状态名 | 解释 |
---|---|---|
NEW | 初始 | 构造一个线程实例后、启动前,线程处于该状态(任何方式创建都是如此,点击可查看线程创建方法) |
RUNNABLE | 就绪/运行 | 该状态包含了经典线程模型的两种状态:就绪(Ready )、运行(Running ):------------------- 就绪状态表示有资格运行,但如果一直没拿到时间片,就一直是就绪状态 * 初始状态的线程, start() 方法被调用后,就进入RUNNABLE 状态,表示就绪(Ready );并开始等待CPU时间片;* 等待或阻塞状态结束,如 sleep() 结束、或其他线程join() 结束、拿到锁,也会进入就绪状态* 线程时间片用完,线程的 yield() 方法会被调用,线程随即进入就绪状态 ------------------- 当线程调度选中该线程、并分配了CPU时间片后,该线程尽管处于 Runnable 状态,但实际上是运行(Running );* 这是线程进入运行状态的唯一方式 |
BLOCKED | 阻塞 | 通常与锁有关系,表示线程正在获取有锁控制的资源,比如进入synchronized代码块,获取ReentryLock等 |
WAITING | 等待 | 进入该状态的线程,等待被显式唤醒(其他线程发出通知或中断,如notify/notifyAll , 或者另外的线程终止如join 的情况),否则处于无限期等待 |
TIMED_WAITING | 超时等待 | 该状态不同于WAITING,它可以在指定的时间后自动唤醒; * 处于这种状态的线程不会被分配CPU执行时间; * Thread.sleep() 执行后,线程就会进入该状态 |
TERMINATED | 终止 | 表示该线程已经执行完毕; * 线程Run方法体结束、或主线程(守护线程)的 main() 方法完成时,线程就认为终止了;* 线程对象可能还存活,但不再是单独执行的线程 * 终止的线程不允许再调用 Thread.start() 方法 |
传统线程模型的3种或5种状态
三种状态:就绪、运行、等待
五种状态:新建、就绪、运行、等待、退出
上面已经把RUNNABLE
拆解成就绪和运行状态,另外Java的BLOCKED
、WAITING
、TIMED_WAITING
都属于传统模型的等待状态。
以上。感谢您的阅读。