当前位置:首页 > Java

java状态如何转换

2026-03-26 06:46:10Java

Java线程状态的转换

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

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

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

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

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

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

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

    java状态如何转换

状态转换示例代码

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
分享给朋友:

相关文章

java如何编程

java如何编程

Java编程基础 Java是一种面向对象的编程语言,广泛应用于企业级开发、移动应用(Android)等领域。以下是Java编程的核心步骤和示例。 环境搭建 安装JDK 从Oracle官网下载适合…

java如何学习

java如何学习

学习Java的有效方法 理解基础概念 Java是一门面向对象的编程语言,掌握基础概念如变量、数据类型、运算符、控制语句(if-else、循环)是必要的。面向对象的核心概念包括类、对象、继承、多态和封装…

如何学好java

如何学好java

理解基础概念 掌握Java的核心概念是学习的基础。包括数据类型、变量、运算符、控制流(如循环和条件语句)、数组等。理解面向对象编程(OOP)的四大特性:封装、继承、多态和抽象。 实践编程练习 通过实…

java如何连接mysql

java如何连接mysql

连接 MySQL 数据库的基本步骤 添加 MySQL 驱动依赖 在项目中引入 MySQL 的 JDBC 驱动。如果使用 Maven,在 pom.xml 中添加以下依赖: <dependency…

java如何打印数组

java如何打印数组

打印数组的方法 在Java中,打印数组有多种方式,以下是几种常见的方法: 使用Arrays.toString()方法 这种方法适用于一维数组,可以快速将数组转换为字符串形式输出: int[] a…

如何安装java运行环境

如何安装java运行环境

下载Java开发工具包(JDK) 访问Oracle官方网站或OpenJDK项目页面,选择适合操作系统的JDK版本进行下载。Windows用户通常选择.exe安装包,macOS用户选择.dmg,Linu…