在 Java 中,线程有几种状态,主要包括 NEW(新建)、RUNNABLE(可运行)、BLOCKED(阻塞)、WAITING(等待)、TIMED_WAITING(计时等待)、和 TERMINATED(终止)。
以下是这些状态之间的转换:
-
NEW(新建): 当使用
new Thread()创建一个线程对象时,线程处于新建状态。 -
RUNNABLE(可运行): 调用
start()方法后,线程进入可运行状态。此时,线程调度器可以随时选择这个线程来运行。 -
BLOCKED(阻塞): 线程在获取锁时,如果锁被其他线程占用,就会进入阻塞状态。当其他线程释放锁时,阻塞的线程重新进入可运行状态。
-
WAITING(等待): 当线程调用
Object.wait()、Thread.join()或LockSupport.park()方法时,线程进入等待状态。在等待状态下,线程需要等待其他线程的通知或中断。 -
TIMED_WAITING(计时等待): 当线程调用带有超时参数的
Thread.sleep()、Object.wait(long)、Thread.join(long)、LockSupport.parkNanos()或LockSupport.parkUntil()方法时,线程进入计时等待状态。在计时等待状态下,线程等待一段时间后会自动返回可运行状态。 -
TERMINATED(终止): 线程执行完
run方法或者发生了未捕获的异常导致线程提前终止时,线程进入终止状态。
这些状态之间的转换是由线程调度器和线程本身的操作共同决定的。例如,线程执行完 run 方法后,就会进入终止状态。阻塞状态、等待状态和计时等待状态都是由线程本身执行的一些方法引起的。不同的状态之间的切换可以通过线程的执行、等待、阻塞等操作触发。