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


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

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

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

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

    1,使用标志位退出线程

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

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

    1. // 定义一个volatile的退出标志
    2. private volatile boolean exitFlag = false;
    3. public void run() {
    4. // 在循环中检查退出标志
    5. while (!exitFlag) {
    6. // 执行线程任务
    7. doSomeWork();
    8. // 可以加入适当的休眠或者其他同步机制
    9. // 以防死循环消耗CPU资源
    10. Thread.sleep(100);
    11. }
    12. // 清理工作(如果有)
    13. cleanup();
    14. }
    15. // 当需要终止线程时,设置退出标志为true
    16. public void stopThread() {
    17. exitFlag = true;
    18. }

    2,使用interrupt()中断机制

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

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

    1. public class InterruptibleTask implements Runnable {
    2. @Override
    3. public void run() {
    4. try {
    5. // 遍历或阻塞操作时定期检查中断状态
    6. while (true) {
    7. if (Thread.currentThread().isInterrupted()) {
    8. // 检测到中断,清理并退出
    9. System.out.println("线程接收到中断请求,开始退出...");
    10. break;
    11. }
    12. // 执行线程任务
    13. doInterruptibleWork();
    14. // 如果在阻塞方法中,例如sleep,interrupt会抛出InterruptedException
    15. Thread.sleep(100);
    16. }
    17. } catch (InterruptedException e) {
    18. // 处理中断异常,通常重新设置中断状态,因为catch会清除它
    19. Thread.currentThread().interrupt();
    20. System.out.println("线程在阻塞方法中被中断");
    21. } finally {
    22. // 清理工作(如果有)
    23. cleanup();
    24. }
    25. }
    26. public void requestStop() {
    27. // 请求中断线程
    28. Thread.currentThread().interrupt();
    29. }
    30. }

    总结

    1. volatile boolean exitFlag 确保了多线程环境下的可见性和有序性,使得所有线程都能看到最新的标志值。
    2. Thread.currentThread().isInterrupted() 方法用于检测当前线程是否被中断,若为真则进行相应处理。
    3. 在finally块中进行必要的清理工作,确保资源得到释放。

  • 相关阅读:
    人人都可用的Newbing部署项目
    “存量竞争” 体验为王,火山引擎边缘云助力内容社区破局
    初见物理引擎库Cannon.js:与Cesium的整合
    管理视频推广工作:新媒体团队的成功策略
    五、Nginx 配置 https
    小程序开发外包费用一般是多少?
    超写实虚拟人制作教程
    大转盘流程
    小侃设计模式(四)-原型模式
    ACTF 2022圆满落幕,0ops战队二连冠!!
  • 原文地址:https://blog.csdn.net/JavaCollege/article/details/138177507