线程状态(各状态的具体含义与状态之间的切换条件)
简单介绍与代码示例
package BringCo_Code;
//Thread 类定义了 6 种线程状态,通过getState()方法获取:
// NEW:新建状态,尚未启动
// RUNNABLE:可运行状态,正在 JVM 中执行或等待 CPU 资源
// BLOCKED:阻塞状态,等待获取锁
// WAITING:等待状态,无限期等待其他线程通知
// TIMED_WAITING:计时等待状态,在指定时间内等待
// TERMINATED:终止状态,已完成执行
public class Thread_State {
public static void main(String[] args) {
Thread thread = new Thread(() -> {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
});
System.out.println("创建后状态:" + thread.getState()); // NEW
thread.start();
System.out.println("启动后状态:" + thread.getState()); // RUNNABLE或TIMED_WAITING
try {
Thread.sleep(200);
System.out.println("运行中状态:" + thread.getState()); // TIMED_WAITING
thread.join();
System.out.println("结束后状态:" + thread.getState()); // TERMINATED
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
详细介绍
一.各状态的含义
新建状态(New)
当线程对象被创建但尚未调用 start() 方法时,线程处于新建状态。
此时线程尚未开始执行,JVM 已经为其分配了内存,但还未进入线程调度队列。
就绪状态(Runnable)
调用 start() 方法后,线程进入就绪状态。
处于此状态的线程已经具备了运行条件,但尚未获得 CPU 时间片。
该状态包含了操作系统线程状态中的 "就绪" 和 "运行中" 两种状态。
阻塞状态(Blocked)
线程在等待获取 synchronized 同步锁时进入阻塞状态。
当一个线程试图获取被其他线程持有的锁时,它会进入阻塞状态。
仅当其他线程释放锁且当前线程获得锁后,才会从阻塞状态恢复到就绪状态。
等待状态(Waiting)
线程进入一种无时间限制的等待状态。
处于此状态的线程不会被分配 CPU 时间片,需要等待其他线程显式唤醒。
超时等待状态(Timed Waiting)
线程进入一种有时间限制的等待状态。
无需其他线程显式唤醒,在指定时间过后会自动恢复到就绪状态。
终止状态(Terminated)
线程执行完毕或因异常退出后进入终止状态。
处于此状态的线程不再具备运行能力,也不能再转换到其他状态。
二.状态之间的切换条件
新建状态 → 就绪状态
调用线程对象的 start() 方法。
就绪状态 → 运行中(属于就绪状态的一部分)
线程调度器从就绪队列中选中该线程,分配 CPU 时间片。
运行中 → 终止状态
线程正常执行完 run() 方法。
线程抛出未捕获的异常或错误。
调用 stop() 方法(已废弃,不推荐使用)。
运行中 → 阻塞状态
线程试图获取 synchronized 锁但未能获得时。
阻塞状态 → 就绪状态
线程成功获取到 synchronized 锁。
运行中 → 等待状态
调用 Object.wait() 方法(未指定超时时间)。
调用 Thread.join() 方法(未指定超时时间)。
调用 LockSupport.park() 方法。
等待状态 → 就绪状态
其他线程调用 Object.notify() 方法。
其他线程调用 Object.notifyAll() 方法。
被加入的线程执行完毕(针对 join() 方法)。
运行中 → 超时等待状态
调用 Thread.sleep(long millis) 方法。
调用 Object.wait(long timeout) 方法(指定超时时间)。
调用 Thread.join(long millis) 方法(指定超时时间)。
调用 LockSupport.parkNanos(long nanos) 方法。
调用 LockSupport.parkUntil(long deadline) 方法。
超时等待状态 → 就绪状态
等待时间到达。
其他线程调用 Object.notify() 方法。
其他线程调用 Object.notifyAll() 方法。
更多推荐

所有评论(0)