在Java中线程有6种状态,我们在本文中介绍一下这6种线程状态各自表示的含义,以及它们之间相互切换的条件.
1. 线程状态的种类
线程的状态是⼀个枚举类型Thread.State
我们可以先遍历Thread.State.values()获取到的数组,打印出是哪6种不同的线程状态.
public class ThreadState {
public static void main(String[] args) {
for (Thread.State state : Thread.State.values()) {
System.out.println(state);
}
}
}
我们可以得到:
接下来我们详细介绍这6种方法表示的含义.
1.1 NEW(新建状态)
线程处在NEW状态意味着线程还没有开启,但是已经实例化出了一个线程对象t.系统内部的线程还未创建.
1.2 TERMINATED(终止状态)
线程处在TERMINATED状态意味着线程已经终止了,内核中的线程已经销毁了.
1.3 Runnable(就绪状态)
线程处在Runnale状态意味着线程处在就绪状态,在这个状态中还可以分为两种更细致的状态:
1. Running 表示这个线程正在执行
2. Ready 表示这个线程可以随时被系统调度执行.
1.4 WAITING(死等状态)
线程处在WAITING状态意味着线程处在死等(不撞南墙不回头)状态,一定要另外的线程结束后,才会解除死等状态,继续向下执行.
1.5 TIMED_WAITING (计时等状态)
线程处在TIMED_WAITING状态意味着线程处在计时等(等得到就等,等不到就算了)状态,只要时间到了不管有没有等到,继续向下执行.
1.6 BLOCKED(锁竞争时的阻塞状态)
这一条在本文中先不做具体介绍,在后续我们讲到如何利用锁解决线程安全问题时,再具体阐述.
2. 线程状态的转换
先附上一张完整的线程状态转换图:
乍一看这里面涉及的状态转换以及使用的方法十分复杂,但是只要我们把我住重点,也是可以轻松理解的.
我们引入一个概念:线程是/不是活的.我们可以通过isAlive()这个方法来判断一个线程是不是活的.根据我们调用这个方法得到的结果,可以得到:除了NEW和TERMINATED状态,其他状态都是活的.
对于任何一个线程来说,它们的一生都遵循:
NEW->RUNNALE->ALIVE->RUNNABLE->TERMINATED,这里的ALIVE包括了RUNNABLE,WAIT,TIMED_WAITING和BLOCKED状态.
也就是说,NEW->ALIVE必须经过RUNNABLE这个桥梁,ALIVE->TERMINATED也必须经过RUNNABLE这个桥梁.
因此,WAIT,TIMED_WAITING和BLOCKED状态只能和RUNNABLE状态之间进行转换.
将上图简化一下,就得到了下图:
一条主线,三条支线