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 相关文章推荐
用tensorflow构建线性回归模型的示例代码
Mar 05 Python
解决python删除文件的权限错误问题
Apr 24 Python
python图像处理入门(一)
Apr 04 Python
Flask框架学习笔记之表单基础介绍与表单提交方式
Aug 12 Python
Python破解BiliBili滑块验证码的思路详解(完美避开人机识别)
Feb 17 Python
Python读取表格类型文件代码实例
Feb 17 Python
django-csrf使用和禁用方式
Mar 13 Python
详解Pandas 处理缺失值指令大全
Jul 30 Python
python实现数据结构中双向循环链表操作的示例
Oct 09 Python
Pycharm如何自动生成头文件注释
Nov 14 Python
在python中读取和写入CSV文件详情
Jun 28 Python
python数字图像处理之对比度与亮度调整示例
Jun 28 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正则校验用户名介绍
2008/07/19 PHP
PHP+SQL 注入攻击的技术实现以及预防办法
2011/01/27 PHP
php 模拟post_验证页面的返回状态(实例讲解)
2013/10/28 PHP
php数组转成json格式的方法
2015/03/09 PHP
PHP实现对数字分隔加千分号的方法
2019/03/18 PHP
js正确获取元素样式详解
2009/08/07 Javascript
ExtJs扩展之GroupPropertyGrid代码
2010/03/05 Javascript
在JS中最常看到切最容易迷惑的语法(转)
2010/10/29 Javascript
Jquery中删除元素的实现代码
2011/12/29 Javascript
AngularJS  $on、$emit和$broadcast的使用
2016/09/05 Javascript
使用Ajax生成的Excel文件并下载的实例
2016/11/21 Javascript
jQuery中$.grep() 过滤函数 数组过滤
2016/11/22 Javascript
JavaScript创建对象_动力节点Java学院整理
2017/06/27 Javascript
JavaScript利用fetch实现异步请求的方法实例
2017/07/26 Javascript
Vue实现动态创建和删除数据的方法
2018/03/17 Javascript
JS闭包经典实例详解
2018/12/20 Javascript
jQuery实现的鼠标拖动浮层功能示例【拖动div等任何标签】
2018/12/29 jQuery
仿iPhone通讯录制作小程序自定义选择组件的实现
2019/05/23 Javascript
jQuery 筛选器简单操作示例
2019/10/02 jQuery
js实现滑动滑块验证登录
2020/07/24 Javascript
微信小程序tab左右滑动切换功能的实现代码
2021/02/08 Javascript
python Pygame的具体使用讲解
2017/11/03 Python
浅析Windows 嵌入python解释器的过程
2019/07/26 Python
如何修复使用 Python ORM 工具 SQLAlchemy 时的常见陷阱
2019/11/19 Python
HTML5实现视频直播功能思路详解
2017/11/16 HTML / CSS
Bose加拿大官方网站:美国知名音响品牌
2019/03/21 全球购物
学期研究性学习个人的自我评价
2014/01/09 职场文书
党员批评与自我批评
2014/02/12 职场文书
关于抽烟的检讨书
2014/02/25 职场文书
优秀教师先进材料
2014/12/16 职场文书
五一放假通知怎么写
2015/08/18 职场文书
小学五年级(说明文3篇)
2019/08/13 职场文书
关于考试抄袭的检讨书
2019/11/02 职场文书
话题作文之成长
2019/12/09 职场文书
python numpy中setdiff1d的用法说明
2021/04/22 Python
Python turtle实现贪吃蛇游戏
2021/06/18 Python