线程状态

操作系统中的线程状态大致可以分为五种:新建、就绪、运行、阻塞和终止。(Linux 系统中进程有 7 种状态,对应的线程也有 7 种状态)由于 Java 的线程是映射到系统内核线程的,所以 Java 的线程状态与之类似。

Java 线程状态

1
2
3
4
5
6
7
8
9
10
11
12
13
public enum State {
NEW,

RUNNABLE,

BLOCKED,

WAITING,

TIMED_WAITING,

TERMINATED;
}

新建(New)

新创建一个线程对象,表现为:Thread thread = new Thread();

就绪及运行(Runnable)

线程创建后,调用 start() 方法,该线程会处于就绪状态,等待被线程调度器选中,获取到 CPU 时间片。当线程获取到执行权,线程处于运行状态,执行 run() 方法。

阻塞(Blocked)

线程由于某些原因放弃 CPU 执行权,让出时间片,暂时停止运行,此时线程处于阻塞状态,直到线程重新进入就绪态,才有机会再次获取 CPU 时间片运行。在 Java 线程中阻塞可以细分为三种:

同步阻塞

处在运行状态的线程在试图进入临界区时需要获取对象的互斥锁,当该锁已经被其他线程占用,操作系统会将程序的运行由用户态切换到内核态调用线程阻塞指令阻塞该线程,同时 JVM 会将该线程放入同步队列中等待。

无限期等待(Waiting)

处于这种状态的线程不会被分配 CPU 执行时间,需要等待其他线程显式唤醒后进入就绪态。

  • Object.wait() 方法
  • Thread.join() 方法
  • LockSupport.park() 方法

超时等待(Timed Waiting)

处于这种状态的线程也不会被分配 CPU 执行时间,即使其他线程不显式唤醒,系统也会在超时时间结束时自动唤醒它们。

  • Thread.sleep(long millis) 方法
  • Object.wait(long timeout) 方法
  • Thread.join(long millis) 方法
  • LockSupport.parkNanos() 方法
  • LockSupport.parkUntil() 方法

终止(Terminated)

run() 方法结束或出现未捕获的异常,线程终止。

Java 线程状态转换

thread_state