当前位置:首页 > 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(终止状态)
    线程执行完毕或异常退出。

状态转换方法及条件

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

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

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

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

  • 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()方法或抛出未捕获异常。

java线程如何转换

代码示例

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程序的基本步骤 安装JDK(Java Development Kit)并配置环境变量。确保javac和java命令可在命令行中运行。JDK是编译和运行Java程序的必备工具。 创建Jav…

java如何连接mysql

java如何连接mysql

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

java如何遍历map

java如何遍历map

遍历Map的几种方法 在Java中,遍历Map有多种方式,可以根据需求选择合适的方法。以下是常见的几种遍历方式: 使用entrySet遍历 通过entrySet()方法获取键值对的集合,可以同时访问…

如何选择java培训

如何选择java培训

评估培训机构资质 选择有正规资质的机构,查看其营业执照、办学许可证等。优先考虑具备人力资源和社会保障部或教育部认证的机构,这类机构的教学质量和课程设置通常更规范。 考察课程内容与行业需求匹配度…

如何用java编程

如何用java编程

Java编程基础指南 环境配置 安装Java开发工具包(JDK),推荐使用最新版本。配置环境变量,确保JAVA_HOME指向JDK安装路径,并将bin目录添加到系统PATH中。验证安装是否成功: j…

java 实现 php ord

java 实现 php ord

Java 实现 PHP 的 ord 函数 PHP 的 ord 函数用于获取字符串中第一个字符的 ASCII 值。在 Java 中,可以通过类型转换或直接使用字符的 Unicode 值实现类似功能。…