线程状态及其转换
一、线程状态
Java中定义线程的状态有6种,可以查看Thread类的State枚举:
public static enum State
{
NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, TERMINATED;
private State() {
}
}
- 初始(NEW):新创建了一个线程对象,还没调用start方法;
- 运行(RUNNABLE):java线程中将就绪(ready)和运行中(running)统称为运行(RUNNABLE)。线程创建后调用了该对象的start方法,此时处于就绪状态,当获得CPU时间片后变为运行中状态;
- 阻塞(BLOCKED):表现线程阻塞于锁;
- 等待(WAITING):进入该状态的线程需要等待其他线程做出一些特定动作(通知或中断);
- 超时等待(TIMED_WAITING):该状态不同于WAITING,它可以在指定时间后自行返回;
- 终止(TERMINATED):表示该线程已经执行完毕。
二、线程状态转换
来看一张线程状态转换图:
下面从代码实例看线程的各个状态:
2.1 超时等待
public class Test {
public static void main(String[] args) throws Exception {
System.out.println("start");
Thread.sleep(100000);
System.out.println("end");
}
}
通过Java VisualVM打印线程dump可以看到此线程处于TIMED_WAITING
状态:
...
"main" #1 prio=5 os_prio=0 tid=0x00000000055b3800 nid=0x4e8c waiting on condition [0x000000000558f000]
java.lang.Thread.State: TIMED_WAITING (sleeping)
at java.lang.Thread.sleep(Native Method)
at Test.main(Test.java:4)
Locked ownable synchronizers:
- None
...
2.2 等待
public class Test {
public static void<