Java ExcutorService优雅关闭方式解析


Posted in Python onMay 30, 2020

关闭时可使用如下代码

public static void waitUntilTerminate(final ExecutorService executorService, final int timeout) {
    try {
      executorService.shutdown();
      if (!executorService.awaitTermination(timeout, TimeUnit.SECONDS)) { //超时后直接关闭
        executorService.shutdownNow();
      }
    } catch (InterruptedException e) { //awaitTermination 出现中断异常也将触发关闭
      executorService.shutdownNow();
    }
  }

但是实际使用中,可能会出现即使使用了shutdownNow方法,还是无法终止线程的问题,那是因为你的线程无法被中断

shutdownNow方法简单理解就是给在运行的线程发一个中断信号,如果你的线程忽略这个信号,那就无法停下来

举个例子来说明这个问题

public class ShutDownUtilsTest {

  private ExecutorService executorService;

  @Before
  public void init() {
    executorService = Executors.newFixedThreadPool(1);
  }

  @Test
  public void shutDownOKTest() {
    ShutDownUtils.waitUntilTerminate(executorService, 1);

    CommonUtils.sleep(1); //等待线程处理中断
    Assert.assertTrue(executorService.isTerminated());
  }

  @Test
  public void shutDownNowFailTest() {
    executorService.execute(this::canNotStopThread);
    ShutDownUtils.waitUntilTerminate(executorService, 0);

    CommonUtils.sleep(1); //等待线程处理中断
    Assert.assertFalse(executorService.isTerminated());
  }

  @Test
  public void shutDownNowOKTest() {
    executorService.execute(this::stopThread);
    ShutDownUtils.waitUntilTerminate(executorService, 0);

    CommonUtils.sleep(1); //等待线程处理中断
    Assert.assertTrue(executorService.isTerminated());
  }

  private void canNotStopThread() {
    for (long i = 0; i < Long.MAX_VALUE; i++) {
    }
  }

  private void stopThread() {
    for (long i = 0; i < Long.MAX_VALUE && !Thread.currentThread().isInterrupted(); i++) {
    }
  }
}

从上面的测试用例可以看到canNotStopThread无法被shutDownNow终止

然而stopThread可以被正常终止,因为通过Thread.currentThread().isInterrupted()在判断线程是否收到了中断信号

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
初步解析Python下的多进程编程
Apr 28 Python
简单学习Python time模块
Apr 29 Python
CentOS 6.X系统下升级Python2.6到Python2.7 的方法
Oct 12 Python
python爬虫框架talonspider简单介绍
Jun 09 Python
不同版本中Python matplotlib.pyplot.draw()界面绘制异常问题的解决
Sep 24 Python
教你使用python实现微信每天给女朋友说晚安
Mar 23 Python
python自动截取需要区域,进行图像识别的方法
May 17 Python
解决win64 Python下安装PIL出错问题(图解)
Sep 03 Python
详解Python计算机视觉 图像扭曲(仿射扭曲)
Mar 27 Python
python内存管理机制原理详解
Aug 12 Python
Python实现图片添加文字
Nov 26 Python
pyqt5 QlistView列表显示的实现示例
Mar 24 Python
Python定时任务APScheduler原理及实例解析
May 30 #Python
Python生成器next方法和send方法区别详解
May 30 #Python
Python新手学习标准库模块命名
May 29 #Python
Django Path转换器自定义及正则代码实例
May 29 #Python
Python新手如何理解循环加载模块
May 29 #Python
Python新手如何进行闭包时绑定变量操作
May 29 #Python
如何理解python中数字列表
May 29 #Python
You might like
Laravel中使用自己编写类库的3种方法
2015/02/10 PHP
Laravel学习教程之request validation的编写
2017/10/25 PHP
thinkphp5实现微信扫码支付
2019/12/23 PHP
js字符串截取函数substr substring slice使用对比
2013/11/27 Javascript
jQuery使用slideUp方法实现控制元素缓慢收起
2015/03/27 Javascript
jQuery实现下拉框选择图片功能实例
2015/08/08 Javascript
js clearInterval()方法的定义和用法
2015/11/11 Javascript
Bootstrap中的Panel和Table全面解析
2016/06/13 Javascript
jQuery动态添加可拖动元素完整实例(附demo源码下载)
2016/06/21 Javascript
JavaScript制作简单分页插件
2016/09/11 Javascript
JS中关于事件处理函数名后面是否带括号的问题
2016/11/16 Javascript
JavaScript数据结构之二叉树的计数算法示例
2017/04/13 Javascript
JavaScript fetch接口案例解析
2018/08/30 Javascript
jQuery 同时获取多个标签的指定内容并储存为数组
2018/11/20 jQuery
vue-resource post数据时碰到Django csrf问题的解决
2020/03/13 Javascript
在Angular中实现一个级联效果的下拉框的示例代码
2020/05/20 Javascript
Python入门篇之函数
2014/10/20 Python
Python协程的用法和例子详解
2017/09/09 Python
python数据抓取分析的示例代码(python + mongodb)
2017/12/25 Python
Django csrf 验证问题的实现
2018/10/09 Python
pycharm使用matplotlib.pyplot不显示图形的解决方法
2018/10/28 Python
详解PyCharm安装MicroPython插件的教程
2019/06/24 Python
浅谈python多进程共享变量Value的使用tips
2019/07/16 Python
Python数据处理篇之Sympy系列(五)---解方程
2019/10/12 Python
PyCharm中关于安装第三方包的三个建议
2020/09/17 Python
CSS3 flex布局之快速实现BorderLayout布局
2015/12/03 HTML / CSS
Made in Design英国:设计家具、照明、家庭装饰和花园家具
2019/09/24 全球购物
马来西亚排名第一的宠物用品店:Pets Wonderland
2020/04/16 全球购物
历史专业个人求职信分享
2013/12/20 职场文书
大学生学习自我评价
2014/01/13 职场文书
小学兴趣小组活动总结
2014/07/07 职场文书
创先争优活动党员公开承诺书
2014/08/29 职场文书
JS不要再到处使用绝对等于运算符了
2021/04/30 Javascript
PostgreSQL 插入INSERT、删除DELETE、更新UPDATE、事务transaction
2022/04/12 PostgreSQL
Python获取字典中某个key的value
2022/04/13 Python
Jmerte 分布式压测及分布式压测配置
2022/04/30 Java/Android