当前位置:首页 > Java

java线程如何转换

2026-03-22 00:06:54Java

Java线程状态转换

Java线程的生命周期包含多种状态,不同状态之间可以通过特定方法或条件进行转换。以下是线程状态及其转换关系的详细说明:

线程的六种状态

  1. NEW(新建状态)
    线程被创建但尚未调用start()方法。

  2. RUNNABLE(可运行状态)
    线程调用start()后进入此状态,可能正在运行或等待CPU资源。

  3. BLOCKED(阻塞状态)
    线程等待获取锁时进入此状态(如synchronized竞争锁失败)。

  4. WAITING(无限期等待)
    通过Object.wait()Thread.join()LockSupport.park()进入,需其他线程显式唤醒。

  5. TIMED_WAITING(限期等待)
    通过Thread.sleep(long)Object.wait(long)等方法进入,超时后自动唤醒。

  6. TERMINATED(终止状态)
    线程执行完毕或异常退出。

    java线程如何转换

状态转换方法及条件

NEW → RUNNABLE
调用线程的start()方法,JVM为其分配资源并调度执行。

RUNNABLE → BLOCKED
线程尝试获取已被其他线程持有的synchronized锁时阻塞。

BLOCKED → RUNNABLE
锁持有者释放锁后,阻塞线程竞争到锁并恢复执行。

RUNNABLE → WAITING
调用以下方法之一:

java线程如何转换

  • Object.wait()(需先持有锁)
  • Thread.join()(等待目标线程终止)
  • LockSupport.park()

WAITING → RUNNABLE
其他线程调用Object.notify()/notifyAll()或目标线程终止(针对join())。

RUNNABLE → TIMED_WAITING
调用以下方法之一:

  • Thread.sleep(long millis)
  • Object.wait(long timeout)
  • Thread.join(long millis)
  • LockSupport.parkNanos(long timeout)

TIMED_WAITING → RUNNABLE
等待超时或被唤醒(如notify()中断等待)。

RUNNABLE → TERMINATED
线程执行完run()方法或抛出未捕获异常。

代码示例

public class ThreadStateDemo {
    public static void main(String[] args) throws InterruptedException {
        Object lock = new Object();
        Thread thread = new Thread(() -> {
            synchronized (lock) {
                try {
                    lock.wait(); // WAITING状态
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });

        System.out.println(thread.getState()); // NEW
        thread.start();
        Thread.sleep(100);
        System.out.println(thread.getState()); // WAITING

        synchronized (lock) {
            lock.notify(); // 唤醒线程
        }
        Thread.sleep(100);
        System.out.println(thread.getState()); // TERMINATED
    }
}

注意事项

  • 线程状态可通过Thread.getState()获取。
  • WAITINGTIMED_WAITING唤醒后需重新竞争锁(如wait()场景)。
  • 调用Thread.interrupt()会中断等待状态,抛出InterruptedException

通过合理使用锁、等待/通知机制及线程调度方法,可以精确控制线程状态转换以满足并发需求。

标签: 线程java
分享给朋友:

相关文章

java中如何输入

java中如何输入

输入方法 在Java中,可以通过多种方式实现输入操作,具体取决于输入来源和需求。以下是几种常见的输入方法: 使用Scanner类 Scanner类是Java中最常用的输入工具,适用于从控制台或文件读…

如何启用java

如何启用java

启用 Java 的方法 检查 Java 是否已安装 在命令行或终端输入 java -version,如果显示版本信息,说明 Java 已安装。若未安装,需从 Oracle 官网 或 OpenJDK 下…

java如何取绝对值

java如何取绝对值

取绝对值的方法 在Java中,取绝对值可以通过以下几种方式实现: 使用Math.abs()方法 Math.abs()是Java中最常用的取绝对值方法,适用于多种数据类型: int abso…

react如何与java配合

react如何与java配合

React 与 Java 配合的常见方式 React 作为前端框架,通常与 Java 后端通过 RESTful API 或 GraphQL 进行交互。以下是几种常见的配合方式: RESTful AP…

js线程实现

js线程实现

JavaScript 线程实现方法 JavaScript 是单线程语言,但可以通过以下方式模拟多线程或实现并行处理: Web Workers Web Workers 允许在后台线程中运行脚本,不会影…

js实现线程

js实现线程

JavaScript 是单线程语言,但可以通过以下方法模拟多线程或实现并发操作: Web Worker Web Worker 允许在后台运行脚本,与主线程并行执行。创建一个新的 Worker 线程:…