JAVA 线程间的状态转换

线程状态图

fullscreen

  1. 新建 (new):新创建了一个线程对象

  2. 可运行 (runnable):线程对象创建后,其他线程 (如 main)调用了该对象的 start() 方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取 cpu 的使用权

  3. 运行 (running):runnable线程获得了 cpu 时间片(timeslice) ,执行代码

  4. 阻塞 (block):线程因为某种原因放弃了 cpu 使用权,暂时停止运行。直到线程进入可运行 (runnable) 状态,才有机会再次获得 cpu timeslice 转到运行 (running) 状态

  5. 死亡 (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) 状态

状态枚举

1
2
3
4
5
6
7
8
 public enum State {
        NEW,
        RUNNABLE,
        BLOCKED,
        WAITING,
        TIMED_WAITING,
        TERMINATED;
    }