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操作xml文件详细介绍
Jun 09 Python
深入解析Python编程中JSON模块的使用
Oct 15 Python
使用pandas对矢量化数据进行替换处理的方法
Apr 11 Python
python3.6使用pymysql连接Mysql数据库
May 25 Python
利用Python对文件夹下图片数据进行批量改名的代码实例
Feb 21 Python
Python字符串内置函数功能与用法总结
Apr 16 Python
选择Python写网络爬虫的优势和理由
Jul 07 Python
Python中的几种矩阵乘法(小结)
Jul 10 Python
利用Python的turtle库绘制玫瑰教程
Nov 23 Python
python词云库wordcloud的使用方法与实例详解
Feb 17 Python
Django 设置多环境配置文件载入问题
Feb 25 Python
Python帮你解决手机qq微信内存占用太多问题
Feb 15 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 Undefined index的问题
2009/06/01 PHP
PHP的PSR规范中文版
2013/09/28 PHP
php+js iframe实现上传头像界面无跳转
2014/04/29 PHP
浅析PHP中的闭包和匿名函数
2017/12/25 PHP
Thinkphp框架使用list_to_tree 实现无限级分类列出所有节点示例
2020/04/04 PHP
用js判断浏览器是否是IE的比较好的办法
2007/05/08 Javascript
jQuery 树形结构的选择器
2010/02/15 Javascript
JQuery报错Uncaught TypeError: Illegal invocation的处理方法
2015/03/13 Javascript
基于jquery实现鼠标滚轮驱动的图片切换效果
2015/10/26 Javascript
jQuery中队列queue()函数的实例教程
2016/05/03 Javascript
JS实现登录页面记住密码和enter键登录方法推荐
2016/05/10 Javascript
1秒50万字!js实现关键词匹配
2016/08/01 Javascript
浅谈vue的iview列表table render函数设置DOM属性值的方法
2017/09/30 Javascript
薪资那么高的Web前端必看书单
2017/10/13 Javascript
微信小程序的生命周期的详解
2017/10/19 Javascript
js实现以最简单的方式将数组元素添加到对象中的方法
2017/12/20 Javascript
js中的深浅拷贝问题简析
2019/05/10 Javascript
vue实现微信浏览器左上角返回按钮拦截功能
2020/01/18 Javascript
[55:25]2018DOTA2亚洲邀请赛3月29日 小组赛A组 VG VS OG
2018/03/30 DOTA
[45:52]2018DOTA2亚洲邀请赛 4.1小组赛 A组加赛 LGD vs Liquid
2018/04/02 DOTA
python判断端口是否打开的实现代码
2013/02/10 Python
Python实现基于HTTP文件传输实例
2014/11/08 Python
Python的Tornado框架实现图片上传及图片大小修改功能
2016/06/30 Python
python xml解析实例详解
2016/11/14 Python
python使用TensorFlow进行图像处理的方法
2018/02/28 Python
树莓派与PC端在局域网内运用python实现即时通讯
2019/06/22 Python
在Django中预防CSRF攻击的操作
2020/03/13 Python
Python爬虫模拟登陆哔哩哔哩(bilibili)并突破点选验证码功能
2020/12/21 Python
使用phonegap操作数据库的实现方法
2017/03/31 HTML / CSS
成都思必达公司C#程序员招聘面试题
2013/06/26 面试题
幼儿园实习生辞职信
2014/01/20 职场文书
群众路线个人剖析材料
2014/10/07 职场文书
门卫岗位职责
2015/02/09 职场文书
2015年教务工作总结
2015/05/23 职场文书
开学第一周值周总结
2015/07/16 职场文书
任命书格式范文
2015/09/22 职场文书