线程状态如图: 一共有 5 种状态, 新建 (New), 就绪 (Runnable), 运行 (Running), 阻塞 (Blocked), 死亡 (Dead)
新建状态: 在程序中一个线程对象被创建出来, 例如: Thread t = new Thread() 此时线程处于新建状态, 线程中的代码还没有被执行;
就绪状态: 顾名思义也就是说线程处于准备执行阶段, 随时可以被 CPU 的调度. 当调用该线程对象的 toStart() 方法时, 该线程就进入了就绪状态, 此时并不会立刻去执行 run() 方法, 线程还必须同其他线程竞争 CPU 时间, 只有获得 CPU 时间才可以运行线程.
运行状态: 当线程获得 CPU 时间片后, 它才进入运行状态, 真正开始执行 run() 方法中的代码. 有可能在时间片消耗完时, run() 中的代码还没执行结束, 此时线程又进入了 Runnable 状态, 线程只能等待下个时间片被 CPU 调度, 所以线程会处于 Runnable,Running 交替转换的过程;
阻塞状态: 当线程在 Running 状态中, 遇到以下情况, 会导致线程进入阻塞状态 (Blocked). 处于阻塞状态的线程, 在阻塞等待结束之后, 会进入 Runnable 状态, 等待获得 CPU 时间片继续运行程序.
(1) 等待阻塞 -- 通过调用线程的 wait() 方法, 让线程等待某工作的完成.
(2) 同步阻塞 -- 线程在获取 synchronized 同步锁失败 (因为锁被其它线程所占用), 它会进入同步阻塞状态.
(3) 其他阻塞 -- 通过调用线程的 sleep() 或 join() 或发出了 I/O 请求时, 线程会进入到阻塞状态. 当 sleep() 状态超时, join()(下篇学习) 等待线程终止或者超时, 或者 I/O 处理完毕时, 线程重新转入就绪状态.
死亡状态: 当线程执行完了或者因异常退出了 run() 方法时, 线程生命周期结束.
来源: http://www.bubuko.com/infodetail-3087459.html