一文带你理解Java线程之间状态转换
线程状态转换
线程对象在不同时期有不同的状态,状态信息就存在于Thread.State枚举类中。
package java.lang;
public class Thread implements Runnable {
public enum State {
NEW,
RUNNABLE,
BLOCKED,
WAITING,
TIMED_WAITING,
TERMINATED;
}
}
- NEW状态是:线程创建后尚未调用start方法
- RUNNABLE状态是:正在Java虚拟机中正在运行
- BLOCKED状态是:线程等待获取锁时的状态
- WAITING状态是: 无限期地等待另一个线程执行某一特定操作的线程
- TIMED_WAITING:等待另一个线程来执行取决于指定等待时间的操作的线程
- TERMINATED:已经退出的线程
调用与线程有关的方法后会进入不同的线程状态。下图展示线程不同状态之间转换:
验证NEW、RUNNABLE和BLOCKED状态
public class MyThread extends Thread {
public MyThread() {
System.out.println("执行构造方法中的线程的状态:" + Thread.currentThread().getState());
System.out.println("执行构造方法中的线程名字:" + Thread.currentThread().getName());
}
@Override
public void run() {
System.out.println("run方法中的状态:" + Thread.currentThread().getState());
System.out.println("run方法中的线程名字是:" + Thread.currentThread().getName());
}
}
public class TestRun {
public static void main(String[] args) {
try {
MyThread t = new MyThread();
t.setName("threadNameA");
System.out.println("main方法中的状态1:" + t.getState());
Thread.sleep(1000);
t.start();
Thread.sleep(1000);
System.out.println("main方法中的状态2:" + t.getState());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
运行结果: