Tailwind CSSTailwind CSS
Home
  • Tailwind CSS 书籍目录
  • Vue 3 开发实战指南
  • React 和 Next.js 学习
  • TypeScript
  • React开发框架书籍大纲
  • Shadcn学习大纲
  • Swift 编程语言:从入门到进阶
  • SwiftUI 学习指南
  • 函数式编程大纲
  • Swift 异步编程语言
  • Swift 协议化编程
  • SwiftUI MVVM 开发模式
  • SwiftUI 图表开发书籍
  • SwiftData
  • ArkTS编程语言:从入门到精通
  • 仓颉编程语言:从入门到精通
  • 鸿蒙手机客户端开发实战
  • WPF书籍
  • C#开发书籍
learn
  • Java编程语言
  • Kotlin 编程入门与实战
  • /python/outline.html
  • AI Agent
  • MCP (Model Context Protocol) 应用指南
  • 深度学习
  • 深度学习
  • 强化学习: 理论与实践
  • 扩散模型书籍
  • Agentic AI for Everyone
langchain
Home
  • Tailwind CSS 书籍目录
  • Vue 3 开发实战指南
  • React 和 Next.js 学习
  • TypeScript
  • React开发框架书籍大纲
  • Shadcn学习大纲
  • Swift 编程语言:从入门到进阶
  • SwiftUI 学习指南
  • 函数式编程大纲
  • Swift 异步编程语言
  • Swift 协议化编程
  • SwiftUI MVVM 开发模式
  • SwiftUI 图表开发书籍
  • SwiftData
  • ArkTS编程语言:从入门到精通
  • 仓颉编程语言:从入门到精通
  • 鸿蒙手机客户端开发实战
  • WPF书籍
  • C#开发书籍
learn
  • Java编程语言
  • Kotlin 编程入门与实战
  • /python/outline.html
  • AI Agent
  • MCP (Model Context Protocol) 应用指南
  • 深度学习
  • 深度学习
  • 强化学习: 理论与实践
  • 扩散模型书籍
  • Agentic AI for Everyone
langchain
  • 第六章:多线程与并发

第六章:多线程与并发

6.2 线程的生命周期与管理

线程的生命周期

在Java中,线程的生命周期可以分为以下几个状态:

  1. 新建(New)

    • 线程对象被创建,但尚未调用start()方法。
    • 此时线程还未开始执行。
  2. 就绪(Runnable)

    • 调用start()方法后,线程进入就绪状态。
    • 线程等待CPU调度,一旦获得CPU时间片,线程开始执行。
  3. 运行(Running)

    • 线程获得CPU资源,执行run()方法中的代码。
    • 线程可能因为时间片用完或主动让出CPU而重新进入就绪状态。
  4. 阻塞(Blocked)

    • 线程因为某些原因(如等待I/O操作、获取锁失败等)暂时停止执行。
    • 阻塞状态解除后,线程重新进入就绪状态。
  5. 等待(Waiting)

    • 线程调用wait()、join()或LockSupport.park()方法进入等待状态。
    • 需要其他线程显式唤醒(如notify()、notifyAll()或LockSupport.unpark())。
  6. 超时等待(Timed Waiting)

    • 线程调用带有超时参数的方法(如sleep(long millis)、wait(long timeout)等)。
    • 超时时间到达后,线程自动恢复。
  7. 终止(Terminated)

    • 线程执行完run()方法或因为异常退出。
    • 线程生命周期结束,无法再次启动。

线程状态转换图

New → Runnable ↔ Running → Terminated
          ↓       ↑
      Blocked/Waiting/Timed Waiting

线程管理

1. 线程的创建与启动

  • 通过继承Thread类或实现Runnable接口创建线程。
  • 调用start()方法启动线程,进入就绪状态。

2. 线程的暂停与恢复

  • 使用Thread.sleep(long millis)让线程进入超时等待状态。
  • 使用wait()和notify()实现线程间的协作。

3. 线程的中断

  • 调用interrupt()方法中断线程。
  • 线程可以通过isInterrupted()检查中断状态,或捕获InterruptedException处理中断。

4. 线程的终止

  • 自然终止:run()方法执行完毕。
  • 强制终止:不推荐使用stop()方法(已废弃),应通过标志位或中断机制优雅终止线程。

5. 线程优先级

  • 通过setPriority(int priority)设置线程优先级(1~10,默认5)。
  • 优先级高的线程获得更多CPU时间片,但不保证绝对顺序。

6. 守护线程(Daemon Thread)

  • 通过setDaemon(true)将线程设置为守护线程。
  • 当所有非守护线程结束时,守护线程会自动终止。

示例代码

public class ThreadLifecycleDemo {
    public static void main(String[] args) throws InterruptedException {
        Thread thread = new Thread(() -> {
            System.out.println("线程开始执行...");
            try {
                Thread.sleep(1000); // 进入超时等待状态
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("线程执行结束。");
        });

        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.join();
        System.out.println("线程状态: " + thread.getState()); // TERMINATED
    }
}

总结

  • 理解线程的生命周期是编写高效并发程序的基础。
  • 合理管理线程状态可以避免死锁、资源竞争等问题。
  • 推荐使用java.util.concurrent包中的工具类简化线程管理。
Last Updated:: 3/27/25, 12:48 PM