news 2026/5/13 20:02:06

多线程:6种状态及其转换条件

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
多线程:6种状态及其转换条件

根据Thread类的源码,Java线程共有6种状态

一,NEW(新建状态)

线程被创建但尚未启动的状态。

当使用`new Thread()`创建一个线程对象后,但还没有调用`start()`方法时,线程就处于NEW状态。此时线程已经分配了内存空间,但还没有开始执行。

Thread thread = new Thread(() -> {
System.out.println("线程执行中");
});
System.out.println("线程状态:" + thread.getState()); // 输出:NEW

二,RUNNABLE(可运行状态)

线程正在Java虚拟机中执行或准备执行,等待系统资源(如CPU时间片)。

RUNNABLE状态实际上包含了两种子状态:
- Ready:线程已经准备好运行,正在等待CPU时间片
- Running:线程正在CPU上执行

需要注意的是,处于RUNNABLE状态的线程不一定正在执行,可能只是在等待CPU调度。

Thread thread = new Thread(() -> {
System.out.println("线程状态:" + Thread.currentThread().getState()); // 输出:RUNNABLE
});
thread.start();

三,BLOCKED(阻塞状态)

线程被阻塞,正在等待获取一个监视器锁(monitor lock)。

当线程试图进入一个被其他线程持有的同步代码块或方法时,就会进入BLOCKED状态。一旦锁被释放,等待的线程就有机会获取锁并继续执行。
public class BlockedExample {
private static final Object lock = new Object();

public static void main(String[] args) {
Thread thread1 = new Thread(() -> {
synchronized (lock) {
try {
Thread.sleep(5000); // 持有锁5秒
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});

Thread thread2 = new Thread(() -> {
synchronized (lock) {
System.out.println("thread2获取到锁");
}
});

thread1.start();
try { Thread.sleep(100); } catch (InterruptedException e) {}
thread2.start();

try { Thread.sleep(100); } catch (InterruptedException e) {}
System.out.println("thread2状态:" + thread2.getState()); // 输出:BLOCKED
}
}

四,WAITING(无限期等待状态)

线程无限期地等待另一个线程执行特定操作。

进入WAITING状态的方法:
- `Object.wait()` - 不带超时时间
- `Thread.join()` - 不带超时时间
- `LockSupport.park()`

退出WAITING状态的条件:
- 其他线程调用对应对象的`notify()`或`notifyAll()`
- 其他线程中断当前线程
- 等待的线程执行完成(针对join情况)

public class WaitingExample {
public static void main(String[] args) throws InterruptedException {
Object lock = new Object();

Thread waitingThread = new Thread(() -> {
synchronized (lock) {
try {
lock.wait(); // 进入WAITING状态
System.out.println("被唤醒,继续执行");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});

waitingThread.start();
Thread.sleep(100);
System.out.println("等待线程状态:" + waitingThread.getState()); // 输出:WAITING

synchronized (lock) {
lock.notify(); // 唤醒等待线程
}
}
}

五,TIMED_WAITING(限期等待状态)

线程在指定的时间范围内等待。

进入TIMED_WAITING状态的方法:
- `Thread.sleep(long millis)`
- `Object.wait(long timeout)`
- `Thread.join(long millis)`
- `LockSupport.parkNanos(long nanos)`
- `LockSupport.parkUntil(long deadline)`

public class TimedWaitingExample {
public static void main(String[] args) throws InterruptedException {
Thread thread = new Thread(() -> {
try {
Thread.sleep(5000); // 睡眠5秒,进入TIMED_WAITING
} catch (InterruptedException e) {
e.printStackTrace();
}
});

thread.start();
Thread.sleep(100);
System.out.println("线程状态:" + thread.getState()); // 输出:TIMED_WAITING
}
}

六,TERMINATED(终止状态)

线程已经执行完毕或异常结束。

线程执行完`run()`方法或者因为未捕获的异常而退出时,就会进入TERMINATED状态。一旦进入此状态,线程就不能再次启动。

public class TerminatedExample {
public static void main(String[] args) throws InterruptedException {
Thread thread = new Thread(() -> {
System.out.println("线程执行完成");
});

thread.start();
thread.join(); // 等待线程执行完成
System.out.println("线程状态:" + thread.getState()); // 输出:TERMINATED
}
}

七,线程状态转换图

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/13 19:59:18

终极指南:如何使用JSON/YAML配置文件优化Nexe构建选项

终极指南:如何使用JSON/YAML配置文件优化Nexe构建选项 【免费下载链接】nexe 🎉 create a single executable out of your node.js apps 项目地址: https://gitcode.com/gh_mirrors/ne/nexe 🎉 想要将Node.js应用打包成单个可执行文件…

作者头像 李华
网站建设 2026/5/13 19:59:16

Origin绘图实战:7个高频问题与高效解决方案

1. 坐标轴刻度显示不全怎么办? 这个问题我遇到过太多次了,尤其是在处理大量数据时。明明数据范围是0-1000,但图表上只显示到500,剩下的数据直接被"截断"了。这种情况通常是因为Origin默认的自动刻度设置不够智能。 解决…

作者头像 李华
网站建设 2026/5/13 19:58:07

Atoll-OS实战:开箱即用的AI助手操作系统部署与深度定制指南

1. 项目概述:从零到一,构建你的专属AI助手舰队如果你和我一样,对AI Agent(智能体)技术充满热情,但又常常被那些“开箱即用”的承诺所困扰——它们往往只给你一个空壳,真正的“灵魂”和“工作能力…

作者头像 李华
网站建设 2026/5/13 19:49:05

技术人的“职业杠杆”:用工具、团队和影响力放大个人价值

在软件测试领域,我们常常谈论自动化、性能、安全等技术,却很少从职业发展的底层逻辑去思考:如何让我们的工作成果产生复利效应?答案就在于构建三个核心杠杆——工具杠杆、团队杠杆和影响力杠杆。它们能将你从繁琐的重复劳动中解放…

作者头像 李华