当前位置: 首页 > news >正文

线程状态与线程方法详解

目录

1. 线程状态介绍

1.1 NEW(新建状态)

1.2 RUNNABLE(可运行状态)

1.3 BLOCKED(阻塞状态)

1.4 WAITING(等待状态)

1.5 TIMED_WAITING(超时等待状态)

1.6 TERMINATED(终止状态)

2. 线程状态转换图

3. 线程常用方法

3.1 线程启动与运行

3.2 线程休眠

3.3 线程等待与唤醒

3.4 线程加入

3.5 线程中断

3.6 线程优先级

3.7 线程礼让

3.8 线程终止

4. 总结


1. 线程状态介绍

在 Java 中,线程的生命周期可以分为多种状态。这些状态定义在 java.lang.Thread.State 枚举类中,具体包括以下六种状态:

1.1 NEW(新建状态)

  • 线程被创建但尚未启动。

  • 此时线程对象已经存在,但还没有调用 start() 方法。

1.2 RUNNABLE(可运行状态)

  • 线程正在 JVM 中执行,或者等待操作系统资源(如 CPU 时间片)。

  • 调用 start() 方法后,线程进入 RUNNABLE 状态。

1.3 BLOCKED(阻塞状态)

  • 线程因为等待锁而进入阻塞状态。

  • 例如,当线程试图获取一个被其他线程持有的锁时,它会进入 BLOCKED 状态。

1.4 WAITING(等待状态)

  • 线程无限期地等待其他线程的显式唤醒。

  • 调用以下方法会使线程进入 WAITING 状态:

    • Object.wait()

    • Thread.join()

    • LockSupport.park()

1.5 TIMED_WAITING(超时等待状态)

  • 线程在指定的时间内等待其他线程的唤醒。

  • 调用以下方法会使线程进入 TIMED_WAITING 状态:

    • Thread.sleep(long millis)

    • Object.wait(long timeout)

    • Thread.join(long millis)

    • LockSupport.parkNanos(long nanos)

    • LockSupport.parkUntil(long deadline)

1.6 TERMINATED(终止状态)

  • 线程执行完毕或异常退出。

  • 线程的 run() 方法执行完成后,线程进入 TERMINATED 状态。


2. 线程状态转换图

以下是线程状态之间的转换关系:

NEW → RUNNABLE → BLOCKED → RUNNABLE → TERMINATED
          ↓
      WAITING
          ↓
   TIMED_WAITING

3. 线程常用方法

Java 提供了许多方法来操作和控制线程的行为。以下是常用的线程方法及其作用:

3.1 线程启动与运行

  • start()

    • 启动线程,使线程进入 RUNNABLE 状态。

    • 只能调用一次,重复调用会抛出 IllegalThreadStateException

  • run()

    • 线程的实际执行逻辑。

    • 直接调用 run() 不会启动新线程,而是在当前线程中执行。

3.2 线程休眠

  • sleep(long millis)

    • 使当前线程休眠指定的毫秒数。

    • 线程进入 TIMED_WAITING 状态。

    • 休眠期间不会释放锁。

try {
    Thread.sleep(1000); // 休眠 1 秒
} catch (InterruptedException e) {
    e.printStackTrace();
}

3.3 线程等待与唤醒

  • wait()

    • 使当前线程进入 WAITING 状态,并释放锁。

    • 需要其他线程调用 notify() 或 notifyAll() 来唤醒。

  • notify()

    • 随机唤醒一个等待该锁的线程。

  • notifyAll()

    • 唤醒所有等待该锁的线程。

synchronized (lock) {
    lock.wait();  // 当前线程等待
    lock.notify(); // 唤醒一个等待线程
}

3.4 线程加入

  • join()

    • 等待目标线程执行完毕。

    • 当前线程进入 WAITING 状态,直到目标线程终止。

  • join(long millis)

    • 等待目标线程执行完毕,但最多等待指定的毫秒数。

Thread thread = new Thread(() -> {
    System.out.println("子线程运行");
});
thread.start();
thread.join(); // 主线程等待子线程结束
System.out.println("主线程继续执行");

3.5 线程中断

  • interrupt()

    • 中断目标线程。

    • 如果线程处于 WAITING 或 TIMED_WAITING 状态,会抛出 InterruptedException

  • isInterrupted()

    • 判断线程是否被中断。

  • static interrupted()

    • 判断当前线程是否被中断,并清除中断状态。

Thread thread = new Thread(() -> {
    while (!Thread.currentThread().isInterrupted()) {
        System.out.println("线程运行中");
    }
    System.out.println("线程被中断");
});
thread.start();
thread.interrupt(); // 中断线程

3.6 线程优先级

  • setPriority(int priority)

    • 设置线程的优先级(1~10)。

    • 优先级越高,线程获得 CPU 时间片的概率越大。

  • getPriority()

    • 获取线程的优先级。

Thread thread = new Thread(() -> System.out.println("线程运行"));
thread.setPriority(Thread.MAX_PRIORITY); // 设置最高优先级
thread.start();

3.7 线程礼让

  • yield()

    • 提示调度器当前线程愿意让出 CPU。

    • 线程从 RUNNABLE 状态回到就绪状态,让其他线程有机会运行。

Thread.yield(); // 当前线程礼让

3.8 线程终止

  • stop()(已废弃)

    • 强制终止线程,不推荐使用,因为它可能导致资源未释放。

  • 推荐方式

    • 使用标志位或 interrupt() 方法来安全地终止线程。

class MyThread extends Thread {
    private volatile boolean running = true;

    @Override
    public void run() {
        while (running) {
            System.out.println("线程运行中");
        }
    }

    public void stopThread() {
        running = false;
    }
}

MyThread thread = new MyThread();
thread.start();
thread.stopThread(); // 安全终止线程

4. 总结

线程的状态和方法是多线程编程的核心内容。通过理解线程的状态转换和掌握常用的线程方法,可以更好地控制线程的行为,编写出高效、稳定的多线程程序。

  • 线程状态:NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、TERMINATED。

  • 常用方法start()sleep()wait()notify()join()interrupt() 等。

相关文章:

  • 三支一扶入职体检不合格项目全解析
  • 算法day5 bfs搜索
  • 图像分类项目1:基于卷积神经网络的动物图像分类
  • JavaEE基础之- 过滤器和监听器Filter and Listener
  • 迷你世界脚本状态接口:Buff
  • 在.net中,async/await的理解
  • 【实战篇】【深度解析DeepSeek:从机器学习到深度学习的全场景落地指南】
  • 通往 AI 之路:Python 机器学习入门-面向对象编程
  • 数据库拓展操作
  • 阿里云 Qwen2.5-Max:超大规模 MoE 模型架构和性能评估
  • 大白话面试遇难题,应对策略是什么?
  • 微信小程序开发学习笔记
  • 知识库技术选型:主流Embedding模型特性对比
  • 阿里云ECS Ubuntu PPTP VPN无法访问以太网
  • 使用SPI总线与外部传感器通信,使用ECU抽象
  • 【Git】Ubuntu 安装 Git Large File Storage(LFS)以及使用 Git LFS 下载
  • 上位机知识篇---Linux\Windows操作系统下获取逻辑处理器数
  • Grok 3 AI 角色扮演提示词 化身顶级设计师
  • 【AD】4-2 利用IPC封装创建向导快速创建PCB封装-SOP8
  • 进程间通信(IPC)与匿名管道
  • 网站建设服务商/网站链接推广工具
  • 网页设计基础开题报告及网页流程图/做抖音seo排名软件是否合法
  • 外贸自建零售网站做仿牌/媒体135网站
  • 销售网站/石家庄关键词优化平台
  • 公司网站谁负责做/北京最新发布信息
  • 做网站和域名/百度seo快速提升排名