结束线程
...大约 1 分钟Java基础集合
1. 使用标志位(推荐方法)
这是最安全和推荐的方法,通过设置一个标志变量来控制线程是否继续执行。
public class MyThread extends Thread {
private volatile boolean running = true;
public void run() {
while (running) {
// 线程工作代码
}
}
public void stopThread() {
running = false;
}
}
// 使用示例
MyThread thread = new MyThread();
thread.start();
// 当需要停止线程时
thread.stopThread();
注意:volatile关键字确保多线程环境下对running变量的可见性。
2. 使用Thread.interrupt()方法
public class MyThread extends Thread {
public void run() {
while (!Thread.currentThread().isInterrupted()) {
try {
// 线程工作代码
} catch (InterruptedException e) {
// 当线程在wait/sleep/join时被中断
Thread.currentThread().interrupt(); // 重新设置中断状态
break;
}
}
}
}
// 使用示例
MyThread thread = new MyThread();
thread.start();
// 当需要停止线程时
thread.interrupt();
3. 不要使用的方法(已废弃)
Thread.stop()- 已废弃,可能导致对象状态不一致
最佳实践
- 使用标志位或interrupt()方法
- 确保线程能够响应停止请求(避免长时间阻塞操作)
- 清理资源(在停止前释放锁、关闭文件等)
- 考虑使用Java并发包中的ExecutorService,它提供了更优雅的线程管理方式
ExecutorService executor = Executors.newSingleThreadExecutor();
executor.submit(() -> {
// 线程任务
});
// 停止线程池
executor.shutdown(); // 温和关闭,它不再接受新的任务,但会继续执行已经提交的任务(包括在队列中的任务)
executor.shutdownNow(); // 立即尝试停止所有任务