java中线程的状态是如何转换的?
在 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
方法后,就会进入终止状态。阻塞状态、等待状态和计时等待状态都是由线程本身执行的一些方法引起的。不同的状态之间的切换可以通过线程的执行、等待、阻塞等操作触发。