Java线程启动必须用start()而非run(),终止应采用volatile标志位协作退出或interrupt()配合中断响应,禁用已废弃的stop()、suspend()等不安全方法。

Java 中线程的启动与终止不能靠“强制命令”,而要依靠协作式设计:启动靠 start() 方法触发,终止靠线程主动检查退出条件并自然结束。盲目调用已废弃的 stop()、suspend() 等方法不仅不安全,还会引发死锁或数据不一致。
启动线程:必须用 start(),不能直接调用 run()
创建线程后,需调用 start() 才真正启动新线程并执行 run() 方法;若直接调用 run(),只是在当前线程同步执行,不会开启新线程。
- ✅ 正确方式:
new Thread(() -> { /* 业务逻辑 */ }).start(); - ❌ 错误方式:
new Thread(() -> { ... }).run();(仍在主线程跑,无并发效果) - ⚠️ 注意:
start()只能调用一次,重复调用抛IllegalThreadStateException
安全终止线程:用 volatile + 标志位协作退出
推荐使用一个 volatile 布尔变量作为运行标志,线程循环中持续检查该标志,为 true 则继续执行,变为 false 时跳出循环、自然结束。
-
volatile保证变量修改对所有线程可见,避免因指令重排序或缓存导致子线程看不到主控线程的修改 - 示例:
public class SafeStopThread extends Thread { private volatile boolean running = true; <pre class="brush:php;toolbar:false;">@Override public void run() { while (running) { // 执行任务,建议含短时阻塞(如 sleep 或 wait),避免空转耗 CPU try { Thread.sleep(100); } catch (InterruptedException e) { Thread.currentThread().interrupt(); // 恢复中断状态 break; } } System.out.println("线程已安全退出"); } public void shutdown() { running = false; }}
Alibabacloud Sdk Client Initialization For Java下载在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 主线程中调用
thread.shutdown()即可请求退出,无需等待,但可配合join()确保结束
处理阻塞中的线程:用 interrupt() 配合中断响应
当线程处于 sleep()、wait()、join() 或 I/O 阻塞时,仅设标志位无法立即退出,需配合 interrupt() 打断阻塞,并在 catch 中处理退出逻辑。
- 调用
thread.interrupt()会设置线程的中断状态,并唤醒阻塞中的线程(抛出InterruptedException) - 捕获异常后应恢复中断状态(
Thread.currentThread().interrupt()),便于上层代码感知中断意图 - 不要忽略
InterruptedException,也不要简单吞掉——它本质是线程的“退出信号”
不推荐也不再支持的终止方式
以下方法在现代 Java 中已被废弃或禁止使用,切勿采用:
-
Thread.stop():强行终止,可能破坏对象状态、留下锁未释放,极易引发数据损坏 -
Thread.suspend()/Thread.resume():易造成死锁(如持锁挂起),且无法保证恢复时机 - 通过
System.exit()终止整个 JVM:粒度太大,不是线程级控制
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










