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中input()与raw_input()的区别分析
Feb 27 Python
Python入门_浅谈逻辑判断与运算符
May 16 Python
Python爬虫中urllib库的进阶学习
Jan 05 Python
python机器学习理论与实战(二)决策树
Jan 19 Python
python使用KNN算法手写体识别
Feb 01 Python
Python向Excel中插入图片的简单实现方法
Apr 24 Python
Python for循环生成列表的实例
Jun 15 Python
Python3.5常见内置方法参数用法实例详解
Apr 29 Python
Pytorch实现各种2d卷积示例
Dec 30 Python
python环境下安装opencv库的方法
Mar 05 Python
利用Python将图片中扭曲矩形的复原
Sep 07 Python
手把手教你使用TensorFlow2实现RNN
Jul 15 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下操作Linux消息队列完成进程间通信的方法
2010/07/24 PHP
PHP 动态生成静态HTML页面示例代码
2014/01/15 PHP
php实现改变图片直接打开为下载的方法
2015/04/14 PHP
jQuery easyui datagrid动态查询数据实例讲解
2013/02/26 Javascript
JS实现超炫网页烟花动画效果的方法
2015/03/02 Javascript
JS使用oumousemove和oumouseout动态改变图片显示的方法
2015/03/31 Javascript
jQuery地图map悬停显示省市代码分享
2015/08/20 Javascript
详解基于Bootstrap扁平化的后台框架Ace
2015/11/27 Javascript
深入分析jQuery的ready函数是如何工作的(工作原理)
2015/12/17 Javascript
Angular2内置指令NgFor和NgIf详解
2016/08/03 Javascript
JavaScript实现大图轮播效果
2017/01/11 Javascript
JS实现选定指定HTML元素对象中指定文本内容功能示例
2017/02/13 Javascript
jQuery实现选项卡功能(两种方法)
2017/03/08 Javascript
vue如何获取点击事件源的方法
2017/08/10 Javascript
使用Vue写一个datepicker的示例
2018/01/27 Javascript
Webpack 之 babel-loader文件预处理器详解
2018/03/23 Javascript
Vuerouter的beforeEach与afterEach钩子函数的区别
2018/12/26 Javascript
vue实现的微信机器人聊天功能案例【附源码下载】
2019/02/18 Javascript
vue实现百度语音合成的实例讲解
2019/10/14 Javascript
浅谈Three.js截图并下载的大坑
2019/11/01 Javascript
原生JS实现烟花效果
2020/03/10 Javascript
给Python IDLE加上自动补全和历史功能
2014/11/30 Python
Python根据欧拉角求旋转矩阵的实例
2019/01/28 Python
python实现的config文件读写功能示例
2019/09/24 Python
python3中numpy函数tile的用法详解
2019/12/04 Python
Python如何读写字节数据
2020/08/05 Python
python 爬虫请求模块requests详解
2020/12/04 Python
css3 伪类选择器快速复习小结
2019/09/10 HTML / CSS
AmazeUI框架搭建的方法步骤(图文)
2020/08/17 HTML / CSS
世界著名的顶级牛排:Omaha Steak(奥马哈牛排)
2016/09/20 全球购物
荷兰超市:DEEN
2018/03/14 全球购物
Booking.com亚太地区:Booking.com APAC
2020/02/07 全球购物
企业安全生产责任书
2014/04/14 职场文书
班主任师德师风自我剖析材料
2014/10/02 职场文书
在HTML5 localStorage中存储对象的示例代码
2021/04/21 Javascript
使用compose函数优化代码提高可读性及扩展性
2022/06/16 Javascript