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 相关文章推荐
python3使用tkinter实现ui界面简单实例
Jan 10 Python
Python中下划线的使用方法
Mar 27 Python
利用Python的Django框架中的ORM建立查询API
Apr 20 Python
Python实现以时间换空间的缓存替换算法
Feb 19 Python
详解Python3中的迭代器和生成器及其区别
Oct 09 Python
Django 多环境配置详解
May 14 Python
pandas实现to_sql将DataFrame保存到数据库中
Jul 03 Python
Django media static外部访问Django中的图片设置教程
Apr 07 Python
树莓派4B安装Tensorflow的方法步骤
Jul 16 Python
pycharm如何使用anaconda中的各种包(操作步骤)
Jul 31 Python
python按照list中字典的某key去重的示例代码
Oct 13 Python
python中使用.py配置文件的方法详解
Nov 23 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
虫族 Zerg 历史背景
2020/03/14 星际争霸
php自动跳转中英文页面
2008/07/29 PHP
php生成固定长度纯数字编码的方法
2015/07/09 PHP
php验证码生成代码
2015/11/11 PHP
学习php设计模式 php实现合成模式(composite)
2015/12/08 PHP
ThinkPHP中create()方法自动验证表单信息
2017/04/28 PHP
ThinkPHP5.1框架页面跳转及修改跳转页面模版示例
2019/05/06 PHP
基于JQuery实现的类似购物商城的购物车
2011/12/06 Javascript
JavaScript对象之深度克隆介绍
2014/12/08 Javascript
JavaScript中的立即执行函数表达式介绍
2015/03/15 Javascript
AngularJS在IE下取数据总是缓存问题的解决方法
2016/08/05 Javascript
Vue.js动态添加、删除选题的实例代码
2016/09/30 Javascript
详解AngularJS通过ocLazyLoad实现动态(懒)加载模块和依赖
2017/03/01 Javascript
Angular浏览器插件Batarang介绍及使用
2018/02/07 Javascript
微信小程序scroll-view横向滑动嵌套for循环的示例代码
2018/09/20 Javascript
Vue面试题及Vue知识点整理
2018/10/07 Javascript
利用Node.js如何实现文件循环覆写
2019/04/05 Javascript
怎样使你的 JavaScript 代码简单易读(推荐)
2019/04/16 Javascript
nodejs搭建本地服务器并访问文件操作示例
2019/05/11 NodeJs
element-ui如何防止重复提交的方法步骤
2019/12/09 Javascript
小程序实现列表倒计时功能
2021/01/29 Javascript
Vue常用API、高级API的相关总结
2021/02/02 Vue.js
Python元组知识点总结
2019/02/18 Python
对Python中class和instance以及self的用法详解
2019/06/26 Python
django使用JWT保存用户登录信息
2020/04/22 Python
通过代码实例了解Python3编程技巧
2020/10/13 Python
HTML5 visibilityState属性详细介绍和使用实例
2014/05/03 HTML / CSS
Perry Ellis官网:美国男士品味服装
2016/12/09 全球购物
Pretty Green美国:英式摇滚服饰风格代表品牌之一
2019/01/23 全球购物
五水共治捐款倡议书
2014/05/14 职场文书
城市规划应届毕业生自荐信
2014/07/04 职场文书
党的群众路线教育实践活动整改方案
2014/10/28 职场文书
期末个人总结范文
2015/02/13 职场文书
2015年家长学校工作总结
2015/04/22 职场文书
实习证明模板
2015/06/16 职场文书
Python使用PyYAML库读写yaml文件的方法
2022/04/06 Python