Java 线程状态
-
新建(New):
- 这是线程被创建但还未启动的初始状态。
- 当创建了一个线程对象,但尚未调用其
start()
方法时,线程处于新建状态。
-
可运行(Runnable):
- 表示线程正在 JVM 中执行或准备好执行的状态,包括正在执行、等待 CPU 时间片、等待阻塞结束等情况。
- 线程进入可运行状态的条件包括:
- 调用线程的
start()
方法后,线程开始执行。 - 等待 CPU 时间片,处于就绪状态。
- 等待阻塞结束,例如等待
synchronized
块的锁或等待wait()
方法被唤醒。
- 调用线程的
-
阻塞(Blocked):
- 表示线程因为某些原因而暂时无法继续执行,处于等待某个条件的状态。
- 线程进入阻塞状态的条件包括:
- 等待
synchronized
块的锁。 - 调用了
Object.wait()
方法,等待被唤醒。 - 等待输入/输出完成。
- 等待
-
等待(Waiting):
- 表示线程处于等待某个条件的状态,需要其他线程显式地通知才能继续执行。
- 线程进入等待状态的条件包括:
- 调用了
Object.wait()
方法。 - 调用了
Thread.join()
方法,等待被等待线程执行完成。 - 调用了
LockSupport.park()
方法。
- 调用了
-
超时等待(Timed Waiting):
- 表示线程处于等待某个条件的状态,但是允许设置等待时间,在等待超时之后会自动恢复。
- 线程进入超时等待状态的条件包括:
- 调用了
Thread.sleep()
方法,等待指定时间。 - 调用了
Object.wait(long timeout)
方法,等待被唤醒或者超时。 - 调用了
Thread.join(long millis)
方法,等待被等待线程执行完成或者超时。 - 调用了
LockSupport.parkNanos()
方法。
- 调用了
-
终止(Terminated):
- 表示线程已经执行完毕或者因为异常退出了执行。
- 线程进入终止状态的条件包括:
- 线程的
run()
方法执行完毕。 - 线程抛出了未捕获的异常而结束执行。
- 线程的
Java 线程状态切换
在 Java 中,线程可以从一个状态转换到另一个状态,具体取决于线程的执行状态和外部条件。以下是线程状态之间的主要切换过程:
-
新建(New)到可运行(Runnable):
- 当创建了一个线程对象后(即调用了
new Thread()
),线程处于新建状态。 - 调用线程的
start()
方法后,线程进入可运行状态,等待 CPU 时间片。
- 当创建了一个线程对象后(即调用了
-
可运行(Runnable)到运行(Running):
- 当线程获得 CPU 时间片后,进入运行状态,开始执行线程的
run()
方法。
- 当线程获得 CPU 时间片后,进入运行状态,开始执行线程的
-
运行(Running)到阻塞(Blocked):
- 当线程需要等待某个条件的满足(如获取锁、等待输入输出完成、调用
Thread.sleep()
等)而无法继续执行时,线程会进入阻塞状态。
- 当线程需要等待某个条件的满足(如获取锁、等待输入输出完成、调用
-
阻塞(Blocked)到可运行(Runnable):
- 当线程等待的条件满足时,如获取到了锁或输入输出完成,线程会从阻塞状态切换回可运行状态,等待 CPU 时间片。
-
运行(Running)到终止(Terminated):
- 线程执行完毕或抛出了未捕获的异常后,线程进入终止状态。
-
可运行(Runnable)到等待(Waiting)或超时等待(Timed Waiting):
- 当线程调用
Object.wait()
方法、Thread.join()
方法或LockSupport.park()
方法时,线程会进入等待状态或超时等待状态。
- 当线程调用
-
等待(Waiting)或超时等待(Timed Waiting)到可运行(Runnable):
- 当线程等待的条件被其他线程满足、等待超时或者调用了
Thread.interrupt()
方法中断等待时,线程会从等待状态或超时等待状态切换回可运行状态。
- 当线程等待的条件被其他线程满足、等待超时或者调用了
-
等待(Waiting)或超时等待(Timed Waiting)到终止(Terminated):
- 当线程处于等待状态或超时等待状态时,调用了
Thread.interrupt()
方法中断线程,或者等待的对象被销毁,线程会从等待状态或超时等待状态直接切换到终止状态。
- 当线程处于等待状态或超时等待状态时,调用了