JAVA 线程间的状态转换
ddatsh
线程状态图
-
新建 (new):新创建了一个线程对象
-
可运行 (runnable):线程对象创建后,其他线程 (如 main)调用了该对象的 start() 方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取 cpu 的使用权
-
运行 (running):runnable线程获得了 cpu 时间片(timeslice) ,执行代码
-
阻塞 (block):线程因为某种原因放弃了 cpu 使用权,暂时停止运行。直到线程进入可运行 (runnable) 状态,才有机会再次获得 cpu timeslice 转到运行 (running) 状态
-
死亡 (dead):线程 run()、main() 方法执行结束,或者因异常退出了 run() 方法,则该线程结束生命周期。死亡的线程不可再次复生
三种阻塞情况
(一). 等待阻塞:运行 (running) 的线程执行 o.wait() 方法,JVM 会把该线程放入等待队列 (waitting queue) 中
(二). 同步阻塞:运行 (running) 的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则 JVM 会把该线程放入锁池 (lock pool) 中
(三). 其他阻塞:运行 (running) 的线程执行 Thread.sleep(long ms) 或 t.join() 方法,或者发出了 I/O 请求时,JVM 会把该线程置为阻塞状态。当 sleep() 状态超时、join() 等待线程终止或者超时、或者 I/O 处理完毕时,线程重新转入可运行 (runnable) 状态
状态枚举
public enum State {
NEW,
RUNNABLE,
BLOCKED,
WAITING,
TIMED_WAITING,
TERMINATED;
}