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基本数据类型详细介绍
Mar 11 Python
python数据结构之二叉树的统计与转换实例
Apr 29 Python
Python的subprocess模块总结
Nov 07 Python
Django中传递参数到URLconf的视图函数中的方法
Jul 18 Python
Python中read()、readline()和readlines()三者间的区别和用法
Jul 30 Python
详解Python中的动态属性和特性
Apr 07 Python
python 拷贝特定后缀名文件,并保留原始目录结构的实例
Apr 27 Python
Python+opencv 实现图片文字的分割的方法示例
Jul 04 Python
Python大数据之网络爬虫的post请求、get请求区别实例分析
Nov 16 Python
python 代码实现k-means聚类分析的思路(不使用现成聚类库)
Jun 01 Python
python画图时设置分辨率和画布大小的实现(plt.figure())
Jan 08 Python
anaconda升级sklearn版本的实现方法
Feb 22 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
php学习笔记之面向对象
2014/11/08 PHP
php静态文件生成类实例分析
2015/01/03 PHP
PHP MYSQL实现登陆和模糊查询两大功能
2016/02/05 PHP
学习PHP session的传递方式
2016/06/15 PHP
Ajax::prototype 源码解读
2007/01/22 Javascript
jquery 操作单选框,复选框,下拉列表实现代码
2009/10/27 Javascript
JavaScript全排列的六种算法 具体实现
2013/06/29 Javascript
javascript的parseFloat()方法精度问题探讨
2013/11/26 Javascript
Node.js文件操作详解
2014/08/16 Javascript
js判断是否按下了Shift键的方法
2015/01/27 Javascript
老生常谈Javascript中的原型和this指针
2016/10/09 Javascript
微信小程序 PHP后端form表单提交实例详解
2017/01/12 Javascript
canvas实现动态小球重叠效果
2017/02/06 Javascript
js实现下拉菜单效果
2017/03/01 Javascript
json对象及数组键值的深度大小写转换问题详解
2018/03/30 Javascript
Vue实现表格批量审核功能实例代码
2019/05/28 Javascript
在vue项目中封装echarts的步骤
2020/12/25 Vue.js
原生微信小程序开发中 redux 的使用详解
2021/02/18 Javascript
[04:20]DOTA2-DPC中国联赛 正赛 VG vs LBZS 选手采访 1月19日
2021/03/11 DOTA
Python函数学习笔记
2008/10/07 Python
Python多进程通信Queue、Pipe、Value、Array实例
2014/11/21 Python
tensorflow1.0学习之模型的保存与恢复(Saver)
2018/04/23 Python
Python实现分段线性插值
2018/12/17 Python
解决Python下json.loads()中文字符出错的问题
2018/12/19 Python
Jacobi迭代算法的Python实现详解
2019/06/29 Python
基于pytorch的lstm参数使用详解
2020/01/14 Python
基于Tensorflow:CPU性能分析
2020/02/10 Python
Django form表单与请求的生命周期步骤详解
2020/06/07 Python
Under Armour安德玛法国官网:美国高端运动科技品牌
2018/06/29 全球购物
测量实习生自我鉴定
2013/09/19 职场文书
办公室文秘岗位职责
2013/11/15 职场文书
小学生新年寄语
2014/04/03 职场文书
世界红十字日活动总结
2015/02/10 职场文书
幼儿园家长工作总结2015
2015/04/25 职场文书
浅谈Python实现opencv之图片色素的数值运算和逻辑运算
2021/06/23 Python
《游戏王:大师决斗》新活动上线 若无符合卡组可免费租用
2022/04/13 其他游戏