继承Thread类的线程生命周期由JVM自动管理,经历NEW→RUNNABLE→BLOCKED/WAITING/TIMED_WAITING→TERMINATED六种状态,开发者只能通过start()、join()、interrupt()等合法方法触发状态迁移,不可直接设置或使用已废弃的stop()等危险方法。

继承 Thread 类创建的线程,其生命周期管理依赖于 Java 线程状态模型和 Thread 类提供的原生方法,不是靠手动“控制”状态切换,而是通过规范调用触发状态迁移。
理解状态流转是管理的前提
线程从创建到结束共经历 6 种状态(NEW → RUNNABLE → BLOCKED/WAITING/TIMED_WAITING → TERMINATED),这些状态由 JVM 自动维护,开发者不能直接设置,只能通过合法操作触发转换:
-
NEW → RUNNABLE:调用
start()后进入,绝不能直接调用run()(那只是普通方法,不启动新线程) -
RUNNABLE → TERMINATED:自然结束(
run()方法执行完毕)或因未捕获异常退出 -
RUNNABLE ↔ WAITING/TIMED_WAITING:调用
wait()、join()、sleep()等主动让出 CPU -
RUNNABLE → BLOCKED:尝试进入被其他线程占用的
synchronized块时发生
关键生命周期控制方法的实际用法
这些方法不改变线程“该做什么”,而是协调它“何时做、是否等、是否停”:
-
join():当前线程等待目标线程终止。常用于主线程等待子线程完成任务后再继续 -
interrupt():给线程打中断标记(isInterrupted()返回true),不会强制停止;若线程正在sleep()、wait()或join(),会抛出InterruptedException并清除中断状态 -
isAlive():判断线程是否处于RUNNABLE或已启动但尚未终止的状态(NEW和TERMINATED都返回false) -
getState():返回当前Thread.State枚举值,适合调试或监控,不用于控制逻辑
避免过时或危险操作
Java 已废弃部分强行干预线程的方法,因其破坏线程安全与状态一致性:
立即学习“Java免费学习笔记(深入)”;
-
不要使用
stop()、suspend()、resume():它们可能导致锁未释放、数据不一致,JDK 早已弃用 -
不要依赖
destroy():该方法从未被实现,仅保留签名 - 若需“取消”任务,应配合
volatile boolean running标志 + 定期检查 +interrupt()协同退出
典型管理场景示例
比如一个继承 Thread 的计数器线程,支持安全停止:
class CountingThread extends Thread {
private volatile boolean running = true;
@Override
public void run() {
int i = 0;
while (running && !Thread.currentThread().isInterrupted()) {
System.out.println("Count: " + i++);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
Thread.currentThread().interrupt(); // 恢复中断状态
break;
}
}
System.out.println("Thread stopped gracefully.");
}
public void shutdown() {
running = false;
interrupt();
}
}
// 使用
CountingThread t = new CountingThread();
t.start();
Thread.sleep(2000);
t.shutdown();
t.join(); // 确保彻底结束


















