java 如何结束线程
如何结束 Java 线程
使用标志位控制线程退出
定义一个 volatile 布尔变量作为标志位,线程运行时检查该标志位,外部通过修改标志位终止线程。
public class MyThread extends Thread {
private volatile boolean running = true;
@Override
public void run() {
while (running) {
// 线程执行的任务
}
}
public void stopThread() {
running = false;
}
}
调用 stopThread() 方法可安全终止线程。
使用 interrupt() 方法中断线程
通过调用线程的 interrupt() 方法设置中断标志,线程内部检查中断状态并退出。
public class MyThread extends Thread {
@Override
public void run() {
while (!Thread.currentThread().isInterrupted()) {
try {
// 线程执行的任务
} catch (InterruptedException e) {
Thread.currentThread().interrupt(); // 重新设置中断标志
}
}
}
}
调用 thread.interrupt() 可中断线程,线程需正确处理中断异常。
使用 ExecutorService 关闭线程池
若线程由线程池管理,可通过 ExecutorService 的 shutdown() 或 shutdownNow() 方法终止线程。
ExecutorService executor = Executors.newFixedThreadPool(1);
executor.submit(() -> {
// 线程任务
});
// 优雅关闭,等待已提交任务完成
executor.shutdown();
// 立即关闭,尝试中断所有正在执行的任务
executor.shutdownNow();
避免使用 stop() 方法
Thread.stop() 已废弃,强制终止线程可能导致资源未释放或数据不一致,应避免使用。
处理阻塞操作的中断
若线程因 sleep()、wait() 或 IO 操作阻塞,需捕获 InterruptedException 并退出。

@Override
public void run() {
try {
while (!Thread.currentThread().isInterrupted()) {
Thread.sleep(1000); // 可能抛出 InterruptedException
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt(); // 恢复中断状态
}
}
通过合理设计线程逻辑和响应中断,可安全有效地终止 Java 线程。






