《架构风清扬-Java面试系列第27讲》Java中如何正确优雅关闭线程?

这道题也是容易答错的题目之一,原因是因为有一个stop方法容易误导大家

一般也是考核工作三年以内的小伙伴,不属于有难度的题目

但由于出现频率不低,所以,钊哥有必要跟小伙伴们聊一聊

来,老规矩,在往下看答案之前,思考下,效果更佳

1,使用标志位退出线程

这种方式是通过共享一个volatile布尔变量作为退出标志,在线程的run方法中不断检查该标志,当标志为true时,线程将自行停止执行。

来,老铁们,三二一,上代码!

java 复制代码
// 定义一个volatile的退出标志
private volatile boolean exitFlag = false;

public void run() {
    // 在循环中检查退出标志
    while (!exitFlag) {
        // 执行线程任务
        doSomeWork();
        
        // 可以加入适当的休眠或者其他同步机制
        // 以防死循环消耗CPU资源
        Thread.sleep(100);
    }
    
    // 清理工作(如果有)
    cleanup();
}

// 当需要终止线程时,设置退出标志为true
public void stopThread() {
    exitFlag = true;
}

2,使用interrupt()中断机制

Java提供了一种协作式中断机制,通过调用Thread.interrupt()来请求线程中断,然后在线程内部通过Thread.isInterrupted()检查中断状态,并作出相应的响应。

来,老铁们,三二一,上代码!

java 复制代码
public class InterruptibleTask implements Runnable {
    @Override
    public void run() {
        try {
            // 遍历或阻塞操作时定期检查中断状态
            while (true) {
                if (Thread.currentThread().isInterrupted()) {
                    // 检测到中断,清理并退出
                    System.out.println("线程接收到中断请求,开始退出...");
                    break;
                }

                // 执行线程任务
                doInterruptibleWork();

                // 如果在阻塞方法中,例如sleep,interrupt会抛出InterruptedException
                Thread.sleep(100); 
            }
        } catch (InterruptedException e) {
            // 处理中断异常,通常重新设置中断状态,因为catch会清除它
            Thread.currentThread().interrupt();
            System.out.println("线程在阻塞方法中被中断");
        } finally {
            // 清理工作(如果有)
            cleanup();
        }
    }

    public void requestStop() {
        // 请求中断线程
        Thread.currentThread().interrupt();
    }
}

总结

  1. volatile boolean exitFlag 确保了多线程环境下的可见性和有序性,使得所有线程都能看到最新的标志值。
  2. Thread.currentThread().isInterrupted() 方法用于检测当前线程是否被中断,若为真则进行相应处理。
  3. 在finally块中进行必要的清理工作,确保资源得到释放。
相关推荐
Scott9999HH3 小时前
【IIoT流量实战】蒸汽管道阀门全关却仍有流量?用 Python 实现涡街信号 FFT 频谱分析与温压全补偿积算网关,深度拆解靠谱的涡街流量计厂家硬核技术标准
开发语言·python
腻害兔3 小时前
【若依项目-产品经理视角】深度拆解 RuoYi-Vue-Pro 商城模块:从商品管理到交易引擎,50 张表撑起一整套电商系统
java·大数据·vue.js·产品经理·ai编程
码智社4 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
AI云海4 小时前
python 列表、元组、集合和字典
开发语言·python
触底反弹4 小时前
🔥 2026 大模型选择指南:别再只看 Benchmark 了,这些维度才是关键!
人工智能·面试
萧瑟余晖5 小时前
JDK 26 新特性详解
java·开发语言
马优晨5 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
醇氧6 小时前
CountDownLatch / CyclicBarrier / Semaphore 面试高频问答清单
前端·面试·职场和发展
2601_960567966 小时前
电商套图自动化效率的工程量化分析——从逐张生成到批量套图的架构演进
运维·架构·自动化
shiyi.十一7 小时前
第2章:应用层 — 知识要点与架构
网络·计算机网络·架构