当前位置:首页 > Java

java状态如何转换

2026-03-26 06:46:10Java

Java线程状态的转换

Java线程在其生命周期中会经历多种状态,这些状态之间的转换遵循特定的规则。Java线程的状态定义在java.lang.Thread.State枚举中,包括以下六种状态:

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

  2. RUNNABLE(可运行状态)
    线程已启动,正在等待CPU时间片或正在运行。

    java状态如何转换

    • NEW状态调用start()方法后进入RUNNABLE状态。
    • 线程在运行过程中可能因时间片用完或调度原因暂时回到RUNNABLE状态。
  3. BLOCKED(阻塞状态)
    线程因等待获取锁而阻塞。

    • 当线程尝试进入synchronized代码块或方法,但锁已被其他线程持有时进入BLOCKED状态。
    • 锁释放后,线程重新进入RUNNABLE状态。
  4. WAITING(等待状态)
    线程因调用Object.wait()Thread.join()LockSupport.park()而进入无限期等待。

    java状态如何转换

    • 需要其他线程调用notify()notifyAll()LockSupport.unpark()来唤醒。
    • 唤醒后进入RUNNABLE状态。
  5. TIMED_WAITING(超时等待状态)
    线程因调用Thread.sleep(long)Object.wait(long)Thread.join(long)等带有超时参数的方法进入限时等待。

    • 超时时间到达或收到唤醒信号后进入RUNNABLE状态。
  6. TERMINATED(终止状态)
    线程执行完run()方法或因异常退出后进入终止状态。

状态转换示例代码

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

        System.out.println(thread.getState()); // NEW
        thread.start();
        System.out.println(thread.getState()); // RUNNABLE

        Thread.sleep(500);
        System.out.println(thread.getState()); // TIMED_WAITING

        Thread.sleep(1000);
        synchronized (ThreadStateDemo.class) {
            System.out.println(thread.getState()); // WAITING
            ThreadStateDemo.class.notify();
        }

        thread.join();
        System.out.println(thread.getState()); // TERMINATED
    }
}

关键转换规则

  • NEWRUNNABLE:调用start()方法。
  • RUNNABLEBLOCKED:竞争锁失败。
  • RUNNABLEWAITING/TIMED_WAITING:调用等待或睡眠方法。
  • WAITING/TIMED_WAITINGRUNNABLE:被唤醒或超时。
  • RUNNABLETERMINATED:线程执行完毕或抛出未捕获异常。

注意:BLOCKED状态仅与同步锁竞争相关,而WAITINGTIMED_WAITING通常由显式的线程协作方法触发。

标签: 状态java
分享给朋友:

相关文章

vue实现订单状态

vue实现订单状态

vue实现订单状态 在Vue中实现订单状态管理,通常需要结合组件设计、状态管理和后端交互。以下是常见的实现方法: 数据定义与状态枚举 // 订单状态常量定义 const ORDER_STATUS…

java如何

java如何

Java 基础语法 Java 是一种面向对象的编程语言,语法相对严谨。每个 Java 程序必须包含一个 main 方法作为程序入口。以下是一个简单的 Java 程序示例: public class…

java如何输入

java如何输入

使用Scanner类进行输入 Scanner类是Java中最常用的输入工具,适用于从控制台或文件读取数据。需要导入java.util.Scanner包。 基本语法: Scanner sca…

如何删除java

如何删除java

卸载 Java 的步骤 Windows 系统: 打开控制面板,选择“程序和功能”或“卸载程序”,在列表中找到 Java 相关条目(如“Java Runtime Environment”或“Java D…

java如何读取文件

java如何读取文件

读取文件的常用方法 Java提供了多种读取文件的方式,适用于不同场景和需求。以下是几种常见的方法: 使用FileInputStream和BufferedInputStream读取二进制文件 try…

java如何调用接口

java如何调用接口

调用接口的基本方法 在Java中调用接口通常涉及实现接口或使用接口引用对象。以下是几种常见场景的示例: 定义接口 public interface MyInterface { void d…