简单介绍与代码示例

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() 方法。

Logo

分享最新、最前沿的AI大模型技术,吸纳国内前几批AI大模型开发者

更多推荐