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自动代理
Mar 28 Python
Python实现多并发访问网站功能示例
Jun 19 Python
windows下pycharm安装、创建文件、配置默认模板
Jul 31 Python
Python 比较文本相似性的方法(difflib,Levenshtein)
Oct 15 Python
python多进程控制学习小结
Oct 31 Python
Python3.5 Json与pickle实现数据序列化与反序列化操作示例
Apr 29 Python
详解python运行三种方式
May 13 Python
Python 中的参数传递、返回值、浅拷贝、深拷贝
Jun 25 Python
Python 微信爬虫完整实例【单线程与多线程】
Jul 06 Python
python中eval与int的区别浅析
Aug 11 Python
浅谈Tensorflow加载Vgg预训练模型的几个注意事项
May 26 Python
Python字典的基础操作
Nov 01 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脚本的10个技巧(6)
2006/10/09 PHP
PHP insert语法详解
2008/06/07 PHP
php数组使用规则分析
2015/02/27 PHP
WordPress中用于获取搜索表单的PHP函数使用解析
2016/01/05 PHP
ThinkPHP静态缓存简单配置和使用方法详解
2016/03/23 PHP
Smarty模板类内部原理实例分析
2019/07/03 PHP
浅析PHP7 的垃圾回收机制
2019/09/06 PHP
PHP 面向对象程序设计之类属性与类常量实现方法分析
2020/04/13 PHP
JavaScript Event学习第七章 事件属性
2010/02/07 Javascript
javascript 精粹笔记
2010/05/09 Javascript
jQuery下的几个你可能没用过的功能
2010/08/29 Javascript
禁用页面部分JavaScript方法的具体实现
2013/07/31 Javascript
js实现的map方法示例代码
2014/01/13 Javascript
使用jquery.upload.js实现异步上传示例代码
2014/07/29 Javascript
基于BootStrap Metronic开发框架经验小结【七】数据的导入、导出及附件的查看处理
2016/05/12 Javascript
基于JS设计12306登录页面
2016/12/28 Javascript
js获取隐藏元素的宽高
2017/02/24 Javascript
Angular之指令Directive用法详解
2017/03/01 Javascript
Ionic3 UI组件之autocomplete详解
2017/06/08 Javascript
EasyUI的TreeGrid的过滤功能的解决思路
2017/08/08 Javascript
JQuery判断radio单选框是否选中并获取值的方法
2019/01/17 jQuery
JS页面动态绘图工具SVG,Canvas,VML介简介
2020/10/16 Javascript
[37:45]完美世界DOTA2联赛PWL S3 LBZS vs Phoenix 第二场 12.09
2020/12/11 DOTA
python实现多线程抓取知乎用户
2016/12/12 Python
CentOS7.3编译安装Python3.6.2的方法
2018/01/22 Python
对python for 文件指定行读写操作详解
2018/12/29 Python
python使用if语句实现一个猜拳游戏详解
2019/08/27 Python
python中property属性的介绍及其应用详解
2019/08/29 Python
tensorflow 初始化未初始化的变量实例
2020/02/06 Python
python GUI库图形界面开发之PyQt5日期时间控件QDateTimeEdit详细使用方法与实例
2020/02/27 Python
沙特阿拉伯电子产品和家用电器购物网站:Black Box
2019/07/24 全球购物
施惠特软件测试面试题以及笔试题
2015/05/13 面试题
技术总监管理职责范本
2014/03/06 职场文书
2016中秋晚会开幕词
2016/03/03 职场文书
基于Redis位图实现用户签到功能
2021/05/08 Redis
MySQL存储过程及语法详解
2022/08/05 MySQL