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调用系统ffmpeg实现视频截图、http发送
Mar 06 Python
怎么使用pipenv管理你的python项目
Mar 12 Python
opencv改变imshow窗口大小,窗口位置的方法
Apr 02 Python
如何使用Python的Requests包实现模拟登陆
Apr 27 Python
python3 拼接字符串的7种方法
Sep 12 Python
python socket 聊天室实例代码详解
Nov 14 Python
基于python调用psutil模块过程解析
Dec 20 Python
使用Python开发个京东上抢口罩的小实例(仅作技术研究学习使用)
Mar 10 Python
jupyter note 实现将数据保存为word
Apr 14 Python
python爬取网易云音乐热歌榜实例代码
Aug 07 Python
使用AJAX和Django获取数据的方法实例
Oct 25 Python
Django REST framework 限流功能的使用
Jun 24 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 MemCached 高级缓存应用代码
2010/08/05 PHP
php curl基本操作详解
2013/07/23 PHP
PHP简单实现HTTP和HTTPS跨域共享session解决办法
2015/05/27 PHP
如何利用http协议发布博客园博文评论
2015/08/03 PHP
php使用preg_match()函数验证ip地址的方法
2017/01/07 PHP
php中通过eval实现字符串格式的计算公式
2017/03/18 PHP
PHP实现数组转JSon和JSon转数组的方法示例
2018/06/14 PHP
用js实现控制内容的向上向下滚动效果
2007/06/26 Javascript
js的逻辑运算符 ||
2010/05/31 Javascript
js的2种继承方式详解
2014/03/04 Javascript
js操作iframe父子窗体示例
2014/05/22 Javascript
JS遍历Json字符串中键值对先转成JSON对象再遍历
2014/08/15 Javascript
jquery插件splitScren实现页面分屏切换模板特效
2015/06/16 Javascript
JS实现的最简Table选项卡效果
2015/10/14 Javascript
详解js中class的多种函数封装方法
2016/01/03 Javascript
Angularjs全局变量被作用域监听的正确姿势
2016/02/06 Javascript
自己动手制作基于jQuery的Web页面加载进度条插件
2016/06/03 Javascript
详解Vue2.0 事件派发与接收
2017/09/05 Javascript
详解JavaScript中的数组合并方法和对象合并方法
2018/05/11 Javascript
vue template中slot-scope/scope的使用方法
2018/09/06 Javascript
生产制造追溯系统之在线打印功能
2019/06/03 Javascript
ES6基础之 Promise 对象用法实例详解
2019/08/22 Javascript
VUE : vue-cli中去掉路由中的井号#操作
2020/09/04 Javascript
[03:42]2018完美盛典-《加冕》
2018/12/16 DOTA
用python删除java文件头上版权信息的方法
2014/07/31 Python
pytorch 使用单个GPU与多个GPU进行训练与测试的方法
2019/08/19 Python
基于html5实现的图片墙效果
2014/10/16 HTML / CSS
意大利制造的西装、衬衫和针对男士量身定制的服装:Lanieri
2018/04/08 全球购物
费用会计岗位职责
2014/01/01 职场文书
高中军训感言400字
2014/02/24 职场文书
汇源肾宝广告词
2014/03/20 职场文书
银行自荐信怎么写
2015/03/05 职场文书
货款欠条范本
2015/07/03 职场文书
物业管理交接协议书
2016/03/24 职场文书
SpringBoot2 参数管理实践之入参出参与校验的方式
2021/06/16 Java/Android
Python 图片添加美颜效果
2022/04/28 Python