Thread生命周期
生命周期概述
Java的线程状态描述放在 Thread
类里面的枚举类 State
中.总共包含了6中状态(从出生到死亡)。
public enum State { /** * 尚未启动的线程的线程状态 (没有start) */ NEW, /** * 可运行线程的线程状态,是可以运行的线程状态(并不是在运行) * 这个状态在Java虚拟机中进行,但它可能等待来自操作系统的其他资源,比如CPU。 * 内部包含了两个状态 【RUNNING】,【READY】这两个状态是可以互相流转的 * 调用了start后线程就处于 READY 状态 ,等待操作系统分配CPU时间片,分配后进入 RUNNING 状态。 * 当调用 yield() 方法后,只是谦让的允许当前线程让出 CPU ,但是不一定让,由操作系统决定,如果让 * 了当前线程就会进入 READY 状态,等待系统分配CPU时间片再次进入 RUNNING 状态。 */ RUNNABLE, /** * 阻塞状态。 * 线程阻塞,等待监视器锁的状态,获取监视器锁后会进入 RUNNABLE 状态 * 当发生线程锁竞争状态下,没有获取到锁的线程会被挂起进入阻塞状态,比如synchronized锁。 */ BLOCKED, /** * 等待线程的线程状态 * 线程调用以下方法会处于等待状态:Object.wait()不超时、Thread.join()不超时等方法 * 一个处于等待状态的线程正在等待另一个线程执行特定动作,例如: * 一个线程调用了Object.wait()方法在一个对象上正在等待另一个线程调用Object.nofify()或者 * Object.nofifyAll()方法开启那个对象 * 一个调用了Thread.join()方法的线程正在等待指定线程终止 */ WAITING, /** * 具有指定等待时间的等待线程的线程状态,调用一下方法会处于这个状态: Object.wait() 超时、 * Thread.join()超时 Thread.sleep(long) 等方法 */ TIMED_WAITING, /** * 已终止线程的线程状态 * 线程执行完毕或者发生异常终止执行 */ TERMINATED; }
线程生命周期流程图
线程生命周期测试
public class ThreadStatusDemo { public static void main(String[] args) throws InterruptedException { // 测试 NEW RUNNABLE TERMINATED Thread terminated_thread = new Thread(() -> { long start = System.currentTimeMillis(); // 运行三秒 ,打印TERMINATED_THREAD线程runnable状态 while (System.currentTimeMillis()-start<3000){} }, "TERMINATED_THREAD"); // NEW Thread.State state = terminated_thread.getState(); System.out.println(terminated_thread.getName()+" :state = " + state); terminated_thread.start(); TimeUnit.SECONDS.sleep(1); // RUNNABLE Thread.State state1 = terminated_thread.getState(); System.out.println(terminated_thread.getName()+"state1 = " + state1); TimeUnit.SECONDS.sleep(5); Thread.