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调用C/C++动态链接库的方法详解
Jul 22 Python
Python爬取三国演义的实现方法
Sep 12 Python
pandas 取出表中一列数据所有的值并转换为array类型的方法
Apr 11 Python
基于django channel实现websocket的聊天室的方法示例
Apr 11 Python
使用Django搭建web服务器的例子(最最正确的方式)
Aug 29 Python
解决pycharm中opencv-python导入cv2后无法自动补全的问题(不用作任何文件上的修改)
Mar 05 Python
python修改linux中文件(文件夹)的权限属性操作
Mar 05 Python
python中判断文件结束符的具体方法
Aug 04 Python
Python+OpenCV图像处理—— 色彩空间转换
Oct 22 Python
使用python向MongoDB插入时间字段的操作
May 18 Python
Python开发之QT解决无边框界面拖动卡屏问题(附带源码)
May 27 Python
使用numpy实现矩阵的翻转(flip)与旋转
Jun 03 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
Access数据库导入Mysql的方法之一
2006/10/09 PHP
解决PHP在DOS命令行下却无法链接MySQL的技术笔记
2010/12/29 PHP
php 数组动态添加实现代码(最土团购系统的价格排序)
2011/12/30 PHP
php修改指定文件后缀的方法
2014/09/11 PHP
php利用反射实现插件机制的方法
2015/03/14 PHP
php正则去除网页中所有的html,js,css,注释的实现方法
2016/11/03 PHP
PHP封装类似thinkphp连贯操作数据库Db类与简单应用示例
2019/05/08 PHP
php基于协程实现异步的方法分析
2019/07/17 PHP
JQuery 国际象棋棋盘 实现代码
2009/06/26 Javascript
JS拖动技术 关于setCapture使用
2010/12/09 Javascript
js iframe跨域访问(同主域/非同主域)分别深入介绍
2013/01/24 Javascript
将字符串中由空格隔开的每个单词首字母大写
2014/04/06 Javascript
JavaScript变量声明详解
2014/11/27 Javascript
js改变css样式的三种方法推荐
2016/06/28 Javascript
微信 java 实现js-sdk 图片上传下载完整流程
2016/10/21 Javascript
jQuery学习笔记——jqGrid的使用记录(实现分页、搜索功能)
2016/11/09 Javascript
基于jQuery实现简单人工智能聊天室
2017/02/10 Javascript
利用Vue v-model实现一个自定义的表单组件
2017/04/27 Javascript
vue.js图片转Base64上传图片并预览的实现方法
2018/08/02 Javascript
微信小程序实现多图上传
2020/06/19 Javascript
Vue3不支持Filters过滤器的问题
2020/09/24 Javascript
Python虚拟环境Virtualenv使用教程
2015/05/18 Python
Python迭代器和生成器定义与用法示例
2018/02/10 Python
python过滤中英文标点符号的实例代码
2019/07/15 Python
python tkinter实现彩球碰撞屏保
2019/07/30 Python
Python 实现毫秒级淘宝抢购脚本的示例代码
2019/09/16 Python
python与mysql数据库交互的实现
2020/01/06 Python
详解HTML5中表单验证的8种方法介绍
2016/12/19 HTML / CSS
opencv实现图像平移效果
2021/03/24 Python
国庆宣传标语
2014/06/30 职场文书
超市创意活动方案
2014/08/15 职场文书
债务授权委托书范本
2014/10/17 职场文书
班级联欢会主持词
2015/07/03 职场文书
调解协议书范本
2016/03/21 职场文书
导游词之西江千户苗寨
2019/12/24 职场文书
python画条形图的具体代码
2022/04/20 Python