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实现根据ip地址反向查找主机名称的方法
Apr 29 Python
在Python中使用HTML模版的教程
Apr 29 Python
简单的Apache+FastCGI+Django配置指南
Jul 22 Python
python 的列表遍历删除实现代码
Apr 12 Python
linux平台使用Python制作BT种子并获取BT种子信息的方法
Jan 20 Python
Python建立Map写Excel表实例解析
Jan 17 Python
python使用RNN实现文本分类
May 24 Python
Python脚本如何在bilibili中查找弹幕发送者
Jun 04 Python
解决TensorFlow调用Keras库函数存在的问题
Jul 06 Python
python实现逻辑回归的示例
Oct 09 Python
Python列表元素删除和remove()方法详解
Jan 04 Python
python解析json数据
Apr 29 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
PHP5+UTF8多文件上传类
2008/10/17 PHP
php简单的留言板与回复功能具体实现
2014/02/19 PHP
使用Zttp简化Guzzle 调用
2017/07/02 PHP
thinkphp5.1框架中容器(Container)和门面(Facade)的实现方法分析
2019/08/05 PHP
JavaScript代码简单实现求杨辉三角给定行的最大值
2013/10/29 Javascript
浅谈JavaScript函数参数的可修改性问题
2013/12/05 Javascript
快速解决jQuery与其他库冲突的方法介绍
2014/01/02 Javascript
JavaScript sub方法入门实例(把字符串显示为下标)
2014/10/17 Javascript
JavaScript中实现Map的示例代码
2015/09/09 Javascript
每天一篇javascript学习小结(属性定义方法)
2015/11/19 Javascript
js实现正则匹配中文标点符号的方法
2015/12/23 Javascript
jquery自定义插件开发之window的实现过程
2016/05/06 Javascript
jquery 遍历数组 each 方法详解
2016/05/25 Javascript
node.js cookie-parser之parser.js
2016/06/06 Javascript
JS实现太极旋转思路分析
2016/12/09 Javascript
Vue 第三方字体图标引入 Font Awesome的方法
2018/09/28 Javascript
小程序点击图片实现自动播放视频
2020/05/29 Javascript
浅谈Vue.js组件(二)
2019/04/09 Javascript
[03:20]2015国际邀请赛全明星表演赛
2015/08/08 DOTA
[02:00]最后,我终于出了辉耀
2018/03/27 DOTA
用Python进行一些简单的自然语言处理的教程
2015/03/31 Python
通过python+selenium3实现浏览器刷简书文章阅读量
2017/12/26 Python
Flask-Mail用法实例分析
2018/07/21 Python
python的继承知识点总结
2018/12/10 Python
Skyscanner台湾:全球知名的旅行比价引擎
2018/07/01 全球购物
Cinque网上商店:德国服装品牌
2019/03/17 全球购物
研究生考核个人自我鉴定
2014/03/27 职场文书
商务日语专业毕业生自荐信
2014/03/27 职场文书
最新大学生创业计划书写作攻略
2014/04/02 职场文书
小班下学期个人总结
2015/02/12 职场文书
离婚案件被告代理词
2015/05/23 职场文书
高中地理教学反思
2016/02/19 职场文书
浅谈Python 中的复数问题
2021/05/19 Python
拙作再改《我的收音机情缘》
2022/04/05 无线电
Java无向树分析 实现最小高度树
2022/04/09 Javascript
CSS使用SVG实现动态分布的圆环发散路径动画
2022/12/24 HTML / CSS