多线程编程在 Java 中是实现高效并发的核心技术之一。每个线程在其生命周期内会经历多个状态,这些状态反映了线程在特定时间点的行为与系统资源的使用情况。了解线程的状态及其转换机制,对于编写健壮的并发程序尤为重要。本文将深入探讨 Java 线程的六种状态、每种状态的含义、状态之间的转换条件以及线程状态在实际应用中的意义。
1. Java 线程的六种状态
根据 Java 虚拟机规范,线程状态可以被分为六种:
- 新建(New)
- 可运行(Runnable)
- 阻塞(Blocked)
- 等待(Waiting)
- 计时等待(Timed Waiting)
- 终止(Terminated)
这些状态为理解线程的生命周期提供了基本框架,帮助开发者掌握线程在不同场景下的行为。
2. 线程状态的含义详解
(1)新建(New)
线程处于新建状态时,它仅仅是一个被创建但尚未启动的对象。在这个状态下,线程对象已经被实例化,但线程还未被调度器纳入可运行线程的集合中。此时,线程还没有占用任何系统资源。
Thread thread = new Thread(() -> {
System.out.println("线程处于新建状态");
});
// 线程尚未启动,处于新建状态
(2)可运行(Runnable)
可运行状态的线程表示它已经准备好执行代码,但并不一定立即执行。Java 中的可运行状态不仅包括真正占用 CPU 时间片的状态,也包括线程在操作系统层面处于等待资源调度的状态。线程在调用 start()
方法后,从新建状态转为可运行状态。
thread.start(); // 线程进入可运行状态
可运行状态的线程可以随时被操作系统调度执行,而调度的时机取决于系统的线程调度策略(例如时间片轮转、优先级调度等)。
(3)阻塞(Blocked)
阻塞状态是线程生命周期中的一个重要环节,通常发生在线程等待获取一个被其他线程持有的锁时。当线程试图进入同步代码块或者同步方法时,如果无法获得锁,它将进入阻塞状态。阻塞状态的线程无法继续执行,直到它成功获取锁为止。
public class Main {
private static final Object lock = new Object();
public static void main(String[] args) {
Thread thread1 = new Thread(() -> {
synchronized (lock) {
System.out.println(Thread.currentThread(