每一个线程都会占用系统资源,因此线程池的关闭与清理同样重要,本文介绍我们如何优雅地关闭线程池。

一. ExecutorService中关闭线程池的方法

1. shutdown()

停止接收新任务,原来的任务继续执行

停止接收新的submit的任务;

已经提交的任务(包括正在跑的和队列中等待的),会继续执行完成;

等到第2步完成后,才真正停止;

2. shutdownNow()

停止接收新任务,原来的任务停止执行

跟 shutdown() 一样,先停止接收新submit的任务;

忽略队列里等待的任务;

尝试将正在执行的任务interrupt中断;

返回未执行的任务列表;

说明:它试图终止线程的方法是通过调用 Thread.interrupt() 方法来实现的,这种方法的作用有限,如果线程中没有sleep 、wait、Condition、定时锁等应用, interrupt() 方法是无法中断当前的线程的。所以,shutdownNow() 并不代表线程池就一定立即就能退出,它也可能必须要等待所有正在执行的任务都执行完成了才能退出。但是大多数时候是能立即退出的。

3. awaitTermination(long timeOut, TimeUnit unit)

当前线程阻塞,timeout 和 TimeUnit 两个参数,用于设定超时的时间及单位,当前线程阻塞,直到:

等所有已提交的任务(包括正在跑的和队列中等待的)执行完;

或者 等超时时间到了(timeout 和 TimeUnit设定的时间);

或者 线程被中断,抛出InterruptedException

然后会监测 ExecutorService 是否已经关闭,返回true(shutdown请求后所有任务执行完毕)或false(已超时)

二. 三种方法的区别

1. shutdown() 和 shutdownNow() 的区别

shutdown()?只是关闭了提交通道,用submit()是无效的;而内部该怎么跑还是怎么跑,跑完再停。

shutdownNow()?能立即停止线程池,正在跑的和正在等待的任务都停下了。

2. shutdown() 和 awaitTermination() 的区别

shutdown()?后,不能再提交新的任务进去;但是?awaitTermination()?后,可以继续提交。

awaitTermination() 是阻塞的,返回结果是线程池是否已停止(true/false);shutdown()?不阻塞。

3. 总结

优雅的关闭,用 shutdown()

想立马关闭,并得到未执行任务列表,用shutdownNow()

优雅的关闭,并允许关闭声明后新任务能提交,用 awaitTermination()

关闭功能 【从强到弱】 依次是:shuntdownNow() > shutdown() > awaitTermination()

三. RunTime.getRunTime().addShutdownHook()的作用

RunTime.getRunTime().addShutdownHook()的作用就是在JVM销毁前执行的最后一个线程,通过addShutdownHook添加钩子,当系统执行完这些钩子后,jvm才会关闭,因此我们可以在这个线程中把我们前面使用ExecutorService创建的线程池优雅地关闭掉。

在web3j中异步执行类(Async)中有如下代码:

// 创建线程池

private static final ExecutorService executor = Executors.newCachedThreadPool();

// 添加关闭线程池的钩子

static {

Runtime.getRuntime().addShutdownHook(new Thread(() - > shutdown(executor)));

}

// 关闭线程池的钩子函数

private static void shutdown(ExecutorService executorService) {

// 第一步:使新任务无法提交

executorService.shutdown();

try {

// 第二步:等待未完成任务结束

if(!executorService.awaitTermination(60, TimeUnit.SECONDS)) {

// 第三步:取消当前执行的任务

executorService.shutdownNow();

// 第四步:等待任务取消的响应

if(!executorService.awaitTermination(60, TimeUnit.SECONDS)) {

System.err.println("Thread pool did not terminate");

}

}

} catch(InterruptedException ie) {

// 第五步:出现异常后,重新取消当前执行的任务

executorService.shutdownNow();

Thread.currentThread().interrupt(); // 设置本线程中断状态

}

}

java 关闭阻塞线程池_如果优雅地关闭ExecutorService提供的java线程池相关推荐

  1. java如何关闭线程池_如何优雅的关闭Java线程池

    ⾯试中经常会问到,创建⼀个线程池需要哪些参数.线程池的工作原理,却很少会问到线程池如何安全关闭的. 也正是因为⼤家不是很关注这块,即便是⼯作三四年的⼈,也会有因为线程池关闭不合理,导致应用⽆法正常st ...

  2. parallelstream启动的线程数_高并发与多线程网络学习笔记(三)线程组和线程池

    线程组 线程组的作用是:可以批量管理线程或线程组对象,有效地对线程或线程组对象进行组织. 构造函数 ThreadGroup(String name)//默认parent为当前线程组 ThreadGro ...

  3. java如何阻塞和同步_同步与异步,阻塞与非阻塞

    今天早上关注了这个问题,刚抽出时间大概整理下,以下仅是个人理解: 一定要多看几遍代码并结合文字理解下 引0.从I/O说起 这些概念之所以容易令人迷惑,在于很多人对I/O就没有清晰准确的理解,后面的理解 ...

  4. mysql5.6 线程池_[MySQL5.6] Percona Server 5.6.14的线程池浅析

    Percona的线程池基本上是从Mariadb中引入,其实现思路也比较简单,就是在线程调度器那增加了一组新的回调函数.线程池可以有效改善在大并发下的性能: Thread pool的原理在Percona ...

  5. nginx没有worker进程_如何优雅地关闭worker进程?

    点击上方"武培轩",选择"设为星标" 技术文章第一时间送达! 之前我们讲解 Nginx 命令行的时候,可以看到 Nginx 停止有两种方式,分别是 nginx ...

  6. java tcp 阻塞等待应答_面试常问!TCP 的三次握手与四次挥手理解

    来源:青柚_ blog.csdn.net/qq_38950316/article/details/81087809 三次握手过程理解 四次挥手过程理解 常见面试题 先来张图! 序列号seq: 占4个字 ...

  7. java退出不报异常_如何优雅的处理异常(java)?

    这篇文章应该可以解答你的疑问. Java中异常提供了一种识别及响应错误情况的一致性机制,有效地异常处理能使程序更加健壮.易于调试.异常之所以是一种强大的调试手段,在于其回答了以下三个问题:什么出了错? ...

  8. 线程打印_面试题:用程序实现两个线程交替打印 0~100 的奇偶数

    作者:dadiyang来源:https://blog.csdn.net/dadiyang/article/details/88315124 面试场景 面试官:Java多线程了解吗?你给我写一下,起两个 ...

  9. python 常量池_聊一聊让我蒙蔽一晚上的各种常量池

    在写之前我们先来看几个问题,假如你对这些问题已经很懂了的话,那大可不用看这篇文章,如果不大懂的话,那么可以看看我的想法. 问题1: public static void main(String[] a ...

最新文章

  1. 程序员为什么要单身?
  2. Android获取手机型号,系统版本,App版本号等信息
  3. Android性能优化典范
  4. Little Sub and Enigma
  5. 15行代码AC_ 【蓝桥杯】兴趣小组(解题报告+思考)
  6. jquery/js 点击空白区域隐藏某一个层/元素
  7. arm nodejs_ARM发布Cortex A78C增强版大核架构
  8. 21 SD配置-主数据-客户账户组分配编号范围
  9. 常见RPM,YUM,DNF指令
  10. 【python】Python的基本数据类型之数据转换
  11. Kubernetes 弃用 Docker !
  12. 俯瞰大雾弥漫下的鄱阳湖二桥
  13. 高等微積分(高木貞治) 1.4節 例2
  14. C#根据word模板生成word表格报表文档
  15. Markdown公式编辑总结
  16. python手绘图_用Python轻松实现手绘图效果
  17. c语言火柴棒编辑,【NOIP2008】火柴棒等式
  18. 【GPS】在线经纬度距离计算
  19. 计算机考研失败了还能找工作吗,考研失败了怎么办_考研失败还能找工作吗
  20. 计算机网络基本设备及网络拓扑图

热门文章

  1. 视图自己定义旋转动画 相似百度音乐
  2. Google LOGO现代舞舞蹈动画
  3. C语言中,两整数相除,若分母为零,则会出现怎样的结果???
  4. jQuery学习(一):鼠标移动显示大图
  5. 博客园-vb随笔列表
  6. 解决CentOS java环境不生效的问题
  7. 【报告分享】2022中国人工智能人才培养报告.pdf(附下载链接)
  8. 【干货】房地产基础知识及开发流程.pdf(附下载链接)
  9. 【白皮书分享】创新中国2030:释放技术红利,解锁增长动能-埃森哲.pdf(附下载链接)...
  10. 【报告分享】2021年30+精致女性人群需求洞察:“她”经济时代科技引领精致生活.pdf(附下载链接)...