Java 线程共有 6 种状态,在任意时刻只能处于其中一种状态,随着代码的执行状态也会发生变化。
线程状态
Java 线程状态定义在 Thread
类的内部枚举类 State
中,其定义如下:
1 | /** |
线程状态的转换
在特定条件下,线程的状态会发生变化。线程状态的转换和变化的条件如下图所示:
初始状态(NEW)
线程被创建完,但是还没有调用start()方法启动线程
1 | public class StateNew { |
输出结果:
1 | myThread: NEW |
可运行状态(RUNNABLE)
表明当前线程已经在执行(RUNNING)或者在等待系统调度执行(READY)。
1 | public class StateRunnable implements Runnable { |
输出结果:
1 | myThread: RUNNABLE |
等待状态(WAITING)
线程调用 Object.wait()
、Thread.join()
、LockSupport.park()
等方法时会进入等待状态
1 | public class StateWaiting implements Runnable { |
执行 jps
命令查看线程ID
1 | 4560 Jps |
然后执行 jstack
查看线程信息
1 | jstack 4546 |
输出结果如下:
1 | "myThread" #12 prio=5 os_prio=31 tid=0x00007fbdfa13c000 nid=0x4403 in Object.wait() [0x000070000a80e000] |
从中可以看出:
- 新创建的线程 myThread 由于执行了
object.wait()
而处于WAITING
状态,在等待其他线程唤起 - main 线程由于执行了
thread.join()
而处于WAITING
状态,在等待 myThread 执行结束
超时等待状态(TIMED_WAITING)
线程调用 Thread.sleep(long)
、Object.wait(long)
、Thread.join(long)
、 LockSupport.parkNanos
、LockSupport.parkUntil
等方法时会进入超时等待状态
把上面的代码改为超时等待
1 | public class StateTimeWaiting implements Runnable { |
查看结果
1 | "myThread" #12 prio=5 os_prio=31 tid=0x00007facf50d6800 nid=0x4103 in Object.wait() [0x000070000a3c3000] |
状态变为 TIMED_WAITING
终止状态(TERMINATED)
线程已经执行完,线程对象可能还存活,但是不能再次执行