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引用模块和查找模块路径
Mar 17 Python
Python实现堆排序的方法详解
May 03 Python
python中的decorator的作用详解
Jul 26 Python
基于python指定包的安装路径方法
Oct 27 Python
在Python中os.fork()产生子进程的例子
Aug 08 Python
python2与python3爬虫中get与post对比解析
Sep 18 Python
在python中做正态性检验示例
Dec 09 Python
Python模块的定义,模块的导入,__name__用法实例分析
Jan 07 Python
详解tensorflow2.x版本无法调用gpu的一种解决方法
May 25 Python
python中的被动信息搜集
Apr 29 Python
Python MNIST手写体识别详解与试练
Nov 07 Python
Pygame Rect区域位置的使用(图文)
Nov 17 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
德生PL550的电路分析
2021/03/02 无线电
一个程序下载的管理程序(二)
2006/10/09 PHP
php实现比较全的数据库操作类
2015/06/18 PHP
PHP远程调试之XDEBUG
2015/12/29 PHP
学习thinkphp5.0验证类使用方法
2017/11/16 PHP
PHP实现的猴王算法(猴子选大王)示例
2018/04/30 PHP
php并发加锁问题分析与设计代码实例讲解
2021/02/26 PHP
Javascript this关键字使用分析
2008/10/21 Javascript
JQuery困惑—包装集 DOM节点
2009/10/16 Javascript
起点页面传值js,有空研究学习下
2010/01/25 Javascript
js数据验证集合、js email验证、js url验证、js长度验证、js数字验证等简单封装
2010/05/15 Javascript
Javascript Object 对象学习笔记
2014/12/17 Javascript
JS实现控制表格行文本对齐的方法
2015/03/30 Javascript
jQuery控制Div拖拽效果完整实例分析
2015/04/15 Javascript
分享javascript计算时间差的示例代码
2020/03/19 Javascript
jQuery EasyUI中DataGird动态生成列的方法
2016/04/05 Javascript
用NodeJS实现批量查询地理位置的经纬度接口
2016/08/16 NodeJs
JS判断来路是否是百度等搜索索引进行弹窗或自动跳转的实现代码
2016/10/09 Javascript
JavaScript Ajax实现异步通信
2016/12/14 Javascript
JavaScript基础之this详解
2017/06/04 Javascript
基于Bootstrap模态对话框只加载一次 remote 数据的解决方法
2017/07/09 Javascript
微信小程序实现图片上传
2019/05/23 Javascript
微信小程序wx.request拦截器使用详解
2019/07/09 Javascript
解决layui动态添加的元素click等事件触发不了的问题
2019/09/20 Javascript
python多线程方式执行多个bat代码
2016/06/07 Python
Python模拟登录之滑块验证码的破解(实例代码)
2019/11/18 Python
Django 限制访问频率的思路详解
2019/12/24 Python
pandas创建DataFrame的7种方法小结
2020/06/14 Python
一款纯css3实现的响应式导航
2014/10/31 HTML / CSS
如何使用css3实现一个类在线直播的队列动画的示例代码
2020/06/17 HTML / CSS
int *p=NULL和*p= NULL有什么区别
2014/10/23 面试题
广州品高软件.net笔面试题目
2012/04/18 面试题
一年级学生期末评语
2014/04/21 职场文书
学习走群众路线心得体会
2014/11/05 职场文书
nginx处理http请求实现过程解析
2021/03/31 Servers
中国古风插画师排行榜:夏达第一,第三是阴阳师姑获鸟皮肤创作者
2022/03/18 国漫