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 27 Python
python实现linux下使用xcopy的方法
Jun 28 Python
python字符串对其居中显示的方法
Jul 11 Python
Python的socket模块源码中的一些实现要点分析
Jun 06 Python
python类的继承实例详解
Mar 30 Python
Python 查看文件的读写权限方法
Jan 23 Python
python异常触发及自定义异常类解析
Aug 06 Python
Django之路由层的实现
Sep 09 Python
tensorflow自定义激活函数实例
Feb 04 Python
Matplotlib配色之Colormap详解
Jan 05 Python
拒绝盗图!教你怎么用python给图片加水印
Jun 04 Python
详解Python函数print用法
Jun 18 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
dede3.1分页文字采集过滤规则详说(图文教程)
2007/04/03 PHP
PHP图片加水印实现方法
2016/05/06 PHP
thinkPHP框架自动填充原理与用法分析
2018/04/03 PHP
PHP实现打包zip并下载功能
2018/06/12 PHP
laravel实现上传图片,并且制作缩略图,按照日期存放的代码
2019/10/16 PHP
Js之软键盘实现(js源码)
2007/01/30 Javascript
javascript中检测变量的类型的代码
2010/12/28 Javascript
javascript数组去掉重复
2011/05/12 Javascript
判断对象是否Window的实现代码
2012/01/10 Javascript
JavaScript匿名函数与委托使用示例
2014/07/22 Javascript
jQuery获取页面元素绝对与相对位置的方法
2015/06/10 Javascript
JS实现支持多选的遍历下拉列表代码
2015/08/20 Javascript
jquery实现文本框textarea自适应高度
2016/03/09 Javascript
Bootstrap免费字体和图标网站(值得收藏)
2017/03/16 Javascript
vue中实现methods一个方法调用另外一个方法
2018/02/08 Javascript
原生JS进行前后端同构
2018/04/22 Javascript
eslint 的三大通用规则详解
2019/05/16 Javascript
Vue图片浏览组件v-viewer用法分析【支持旋转、缩放、翻转等操作】
2019/11/04 Javascript
vue prop属性传值与传引用示例
2019/11/13 Javascript
Vue简单封装axios之解决post请求后端接收不到参数问题
2020/02/16 Javascript
python解析模块(ConfigParser)使用方法
2013/12/10 Python
python实现多线程暴力破解登陆路由器功能代码分享
2015/01/04 Python
python使用turtle库绘制树
2018/06/25 Python
python中cPickle类使用方法详解
2018/08/27 Python
pytorch多进程加速及代码优化方法
2019/08/19 Python
python return逻辑判断表达式实现解析
2019/12/02 Python
python 使用tkinter+you-get实现视频下载器
2020/11/17 Python
Monica Vinader官网:英国轻奢珠宝品牌
2020/02/05 全球购物
C语言50道问题
2014/10/23 面试题
《傅雷家书》教学反思
2014/04/20 职场文书
班风口号
2014/06/18 职场文书
公务员年度考核登记表个人总结
2015/02/12 职场文书
从事会计工作年限证明
2015/06/23 职场文书
授权协议书范本(3篇)
2019/10/15 职场文书
Python制作春联的示例代码
2022/01/22 Python
Java实现二分搜索树的示例代码
2022/03/17 Java/Android