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中实现远程调用(RPC、RMI)简单例子
Apr 28 Python
python简单猜数游戏实例
Jul 09 Python
一个基于flask的web应用诞生 用户注册功能开发(5)
Apr 11 Python
对Python3中的input函数详解
Apr 22 Python
python 快速把超大txt文件转存为csv的实例
Oct 26 Python
PyQt5实现类似别踩白块游戏
Jan 24 Python
Django框架设置cookies与获取cookies操作详解
May 27 Python
Django自带日志 settings.py文件配置方法
Aug 30 Python
Python greenlet和gevent使用代码示例解析
Apr 01 Python
Pycharm连接远程服务器过程图解
Apr 30 Python
解决numpy数组互换两行及赋值的问题
Apr 17 Python
python基础之while循环语句的使用
Apr 20 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根据IP判断地区名信息的示例代码
2014/03/03 PHP
php中ob_get_length缓冲与获取缓冲长度实例
2014/11/20 PHP
PHPCMS2008广告模板SQL注入漏洞修复
2016/10/11 PHP
Laravel框架搜索分页功能示例
2019/02/01 PHP
Aster vs Newbee BO3 第三场2.18
2021/03/10 DOTA
Javascript &amp; DHTML 实例编程(教程)(三)初级实例篇1—上传文件控件实例
2007/06/02 Javascript
javascript 动态加载 css 方法总结
2009/07/11 Javascript
jquery 鼠标滑动显示详情应用示例
2014/01/24 Javascript
Jquery中国地图热点效果-鼠标经过弹出提示层信息的简单实例
2014/02/12 Javascript
jquery分析文本里url或邮件地址为真实链接的方法
2015/06/20 Javascript
基于Vue的延迟加载插件vue-view-lazy
2018/05/21 Javascript
在Bootstrap开发框架中使用dataTable直接录入表格行数据的方法
2018/10/25 Javascript
微信小程序动画(Animation)的实现及执行步骤
2018/10/28 Javascript
vue返回上一页面时回到原先滚动的位置的方法
2018/12/20 Javascript
js实现坦克移动小游戏
2019/10/28 Javascript
Python中Continue语句的用法的举例详解
2015/05/14 Python
linux下python抓屏实现方法
2015/05/22 Python
Python实现爬虫设置代理IP和伪装成浏览器的方法分享
2018/05/07 Python
python SMTP实现发送带附件电子邮件
2018/05/22 Python
Python自然语言处理 NLTK 库用法入门教程【经典】
2018/06/26 Python
python实现键盘控制鼠标移动
2020/11/27 Python
Python内置random模块生成随机数的方法
2019/05/31 Python
python爬虫 urllib模块发起post请求过程解析
2019/08/20 Python
解析HTML5的存储功能和web SQL的相关操作方法
2016/02/19 HTML / CSS
Tory Burch德国官网:美国时尚生活品牌
2018/01/03 全球购物
耐克波兰官方网站:Nike波兰
2019/09/03 全球购物
PatPat德国:妈妈的每日优惠
2019/10/02 全球购物
屈臣氏越南官网:Watsons越南
2021/01/14 全球购物
下面代码从性能上考虑,有什么问题
2015/04/03 面试题
滞留工资返还协议书
2014/10/19 职场文书
教师党员学习十八届四中全会思想汇报
2014/11/03 职场文书
优秀党员主要事迹材料
2015/11/04 职场文书
《地震中的父与子》教学反思
2016/02/16 职场文书
导游词之西安大清真寺
2019/12/17 职场文书
如何使用Python对NetCDF数据做空间相关分析
2021/04/21 Python
Python自然语言处理之切分算法详解
2021/04/25 Python