当前位置:   article > 正文

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

《架构风清扬-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块中进行必要的清理工作,确保资源得到释放。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/508659
推荐阅读
相关标签
  

闽ICP备14008679号