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中的wxPython实现最基本的浏览器功能
Apr 14 Python
python迭代器与生成器详解
Mar 10 Python
jupyter安装小结
Mar 13 Python
用不到50行的Python代码构建最小的区块链
Nov 16 Python
pyqt5让图片自适应QLabel大小上以及移除已显示的图片方法
Jun 21 Python
解决python xx.py文件点击完之后一闪而过的问题
Jun 24 Python
Python 占位符的使用方法详解
Jul 10 Python
python将四元数变换为旋转矩阵的实例
Dec 04 Python
pandas 中对特征进行硬编码和onehot编码的实现
Dec 20 Python
Python 从attribute到property详解
Mar 05 Python
python GUI库图形界面开发之PyQt5布局控件QGridLayout详细使用方法与实例
Mar 06 Python
python 中 .py文件 转 .pyd文件的操作
Mar 04 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
一个可以找出源代码中所有中文的工具
2006/10/25 PHP
php采用ajax数据提交post与post常见方法总结
2014/11/10 PHP
php中base_convert()进制数字转换函数实例
2014/11/20 PHP
php7 新增功能实例总结
2020/05/25 PHP
JavaScript Prototype对象
2009/01/07 Javascript
纯javascript移动优先的幻灯片效果
2015/11/02 Javascript
浅析AngularJS中的指令
2016/03/20 Javascript
创建基于Bootstrap的下拉菜单的DropDownList的JQuery插件
2016/06/02 Javascript
AngularJS动态加载模块和依赖的方法分析
2016/11/08 Javascript
基于es6三点运算符的使用方法(实例讲解)
2017/10/12 Javascript
JS Input里添加小图标的两种方法
2017/11/11 Javascript
Vue.js组件间的循环引用方法示例
2017/12/27 Javascript
浅谈angularJS2中的界面跳转方法
2018/08/31 Javascript
傻瓜式vuex语法糖kiss-vuex整理
2018/12/21 Javascript
微信小程序实现人脸识别登陆的示例代码
2019/04/02 Javascript
JavaScript中的连续赋值问题实例分析
2019/07/12 Javascript
详解vue+axios给开发环境和生产环境配置不同的接口地址
2019/08/16 Javascript
详解vue beforeEach 死循环问题解决方法
2020/02/25 Javascript
Vue如何基于es6导入外部js文件
2020/05/15 Javascript
Node.js web 应用如何封装到Docker容器中
2020/09/01 Javascript
ES11新增的这9个新特性,你都掌握了吗
2020/10/15 Javascript
[02:18]DOTA2英雄基础教程 育母蜘蛛
2014/01/20 DOTA
[02:57]DOTA2亚洲邀请赛 SECRET战队出场宣传片
2015/02/07 DOTA
浅析python实现scrapy定时执行爬虫
2018/03/04 Python
解决在pycharm中显示额外的 figure 窗口问题
2019/01/15 Python
详解Python利用random生成一个列表内的随机数
2019/08/21 Python
pytorch 数据处理:定义自己的数据集合实例
2019/12/31 Python
Python实现结构体代码实例
2020/02/10 Python
全方位了解CSS3的Regions扩展
2015/08/07 HTML / CSS
英国最大的在线快递公司之一:ParcelHero
2019/11/04 全球购物
化学相关工作求职信
2013/10/02 职场文书
历史专业毕业生的自我鉴定
2013/11/15 职场文书
劲霸男装广告词
2014/03/21 职场文书
升学宴主持词
2014/04/02 职场文书
买卖协议书范本
2014/04/21 职场文书
网络营销计划
2015/01/17 职场文书