Loading... # 线程状态转换、创建及停止方式解析 🔄 在多线程编程中,**<span style="color:red">线程的状态转换、创建和停止</span>** 是核心概念。理解这些概念有助于编写高效、安全的并发程序。本文将深入解析线程的生命周期、状态转换以及创建和停止线程的方式。 ## 一、线程的基本概念 🧵 **线程** 是操作系统能够进行运算调度的最小单位,它是比进程更小的独立单位。线程在程序中执行代码,多个线程可以并发执行,提高程序的效率。 ## 二、线程的状态及转换 🔄 线程在生命周期中会经历多个状态,主要包括: - **<span style="color:red">新建状态(New)</span>** - **<span style="color:red">就绪状态(Runnable)</span>** - **<span style="color:red">运行状态(Running)</span>** - **<span style="color:red">阻塞状态(Blocked)</span>** - **<span style="color:red">等待状态(Waiting)</span>** - **<span style="color:red">计时等待状态(Timed Waiting)</span>** - **<span style="color:red">终止状态(Terminated)</span>** ### 2.1 状态转换图 🖼️ ```mermaid graph TD A[新建] --> B[就绪] B --> C[运行] C --> D[阻塞] C --> E[等待] C --> F[计时等待] D --> B E --> B F --> B C --> G[终止] ``` ### 2.2 状态解释 - **新建状态**:线程被创建但未启动。 - **就绪状态**:线程已就绪,等待CPU调度。 - **运行状态**:线程正在执行。 - **阻塞状态**:线程等待获取锁或资源。 - **等待状态**:线程等待其他线程的特定操作。 - **计时等待状态**:线程在指定时间内等待。 - **终止状态**:线程执行结束或被终止。 ## 三、线程的创建方式 🚀 以 Java 为例,创建线程有以下几种方式: ### 3.1 继承 `Thread` 类 ```java public class MyThread extends Thread { @Override public void run() { System.out.println("线程运行中..."); } } public class Main { public static void main(String[] args) { MyThread thread = new MyThread(); thread.start(); } } ``` **解释**: - **`MyThread`**:继承自 `Thread`,重写 `run` 方法。 - **`thread.start()`**:启动线程,进入就绪状态,等待 CPU 调度。 ### 3.2 实现 `Runnable` 接口 ```java public class MyRunnable implements Runnable { @Override public void run() { System.out.println("线程运行中..."); } } public class Main { public static void main(String[] args) { Thread thread = new Thread(new MyRunnable()); thread.start(); } } ``` **解释**: - **`MyRunnable`**:实现 `Runnable` 接口,重写 `run` 方法。 - **`new Thread(new MyRunnable())`**:创建线程对象。 - **优点**:避免单继承的限制,线程与任务分离。 ### 3.3 使用匿名内部类 ```java public class Main { public static void main(String[] args) { Thread thread = new Thread(() -> { System.out.println("线程运行中..."); }); thread.start(); } } ``` **解释**: - **Lambda 表达式**:简化代码,实现 `Runnable` 接口的 `run` 方法。 - **适用性**:适合一次性使用的简单线程任务。 ## 四、线程的停止方式 🛑 ### 4.1 使用标志位停止线程 ```java public class MyThread extends Thread { private volatile boolean running = true; @Override public void run() { while (running) { System.out.println("线程运行中..."); // 执行任务 } } public void stopThread() { running = false; } } public class Main { public static void main(String[] args) throws InterruptedException { MyThread thread = new MyThread(); thread.start(); Thread.sleep(1000); // 主线程休眠1秒 thread.stopThread(); // 停止线程 } } ``` **解释**: - **`volatile boolean running`**:使用 `volatile` 保证变量的可见性。 - **`while (running)`**:线程在 `running` 为 `true` 时运行。 - **`stopThread()`**:设置 `running` 为 `false`,停止线程。 ### 4.2 使用 `interrupt` 方法 ```java public class MyThread extends Thread { @Override public void run() { try { while (!isInterrupted()) { System.out.println("线程运行中..."); Thread.sleep(500); } } catch (InterruptedException e) { System.out.println("线程被中断"); } } } public class Main { public static void main(String[] args) throws InterruptedException { MyThread thread = new MyThread(); thread.start(); Thread.sleep(1000); thread.interrupt(); // 中断线程 } } ``` **解释**: - **`isInterrupted()`**:检查线程是否被中断。 - **`interrupt()`**:设置线程的中断标志,并抛出 `InterruptedException`。 - **异常处理**:在 `catch` 块中处理线程的中断逻辑。 ### 4.3 注意事项 ⚠️ - **不要使用 `stop()` 方法**:已被废弃,可能导致线程不安全。 - **优雅停止线程**:使用标志位或 `interrupt()` 方法,确保线程安全地结束。 ## 五、线程状态转换详解 🔄 ### 5.1 新建到就绪 - **调用 `start()` 方法**:线程从新建状态进入就绪状态,等待 CPU 调度。 ### 5.2 就绪到运行 - **获得 CPU 时间片**:线程被调度器选中,进入运行状态。 ### 5.3 运行到阻塞 - **等待获取锁**:`synchronized` 块被其他线程占用。 - **I/O 操作**:等待 I/O 资源。 ### 5.4 运行到等待 - **调用 `wait()` 方法**:线程主动放弃 CPU,等待被唤醒。 - **无时间限制的等待**:直到被其他线程唤醒。 ### 5.5 运行到计时等待 - **调用 `sleep(long millis)` 方法**:线程休眠指定时间。 - **调用 `wait(long timeout)` 方法**:等待指定时间。 ### 5.6 阻塞/等待到就绪 - **条件满足**:如获取到锁、I/O 完成、被唤醒等,线程重新进入就绪状态。 ### 5.7 运行到终止 - **正常执行完毕**:`run()` 方法执行结束。 - **异常终止**:发生未捕获的异常。 ## 六、线程状态转换表格 📊 | 当前状态 | 转换方式 | 目标状态 | | ---------------- | ------------------ | ------------------------- | | 新建(New) | 调用 `start()` | 就绪(Runnable) | | 就绪(Runnable) | 获得 CPU 时间片 | 运行(Running) | | 运行(Running) | 调用 `wait()` | 等待(Waiting) | | 运行(Running) | 调用 `sleep()` | 计时等待(Timed Waiting) | | 运行(Running) | 等待 I/O、获取锁 | 阻塞(Blocked) | | 阻塞/等待 | 条件满足 | 就绪(Runnable) | | 运行(Running) | 线程执行完毕或异常 | 终止(Terminated) | ## 七、线程的最佳实践 💡 - **避免使用过时的方法**:如 `stop()`、`suspend()`、`resume()`。 - **使用同步机制**:`synchronized`、`Lock`、`Condition`,确保线程安全。 - **合理使用线程池**:避免频繁创建和销毁线程,提升性能。 ## 八、总结 🏁 理解 **<span style="color:red">线程的状态转换</span>**、**<span style="color:red">创建方式</span>** 和 **<span style="color:red">停止方法</span>**,对于编写高效可靠的并发程序至关重要。通过合理地管理线程生命周期,可以提高程序的性能和稳定性。 --- 希望本文对您深入理解线程的概念有所帮助,祝您在多线程编程的道路上越走越远!🚀 最后修改:2024 年 10 月 10 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏