java 关闭阻塞线程池_如果优雅地关闭ExecutorService提供的java线程池
每一个线程都会占用系统资源,因此线程池的关闭与清理同样重要,本文介绍我们如何优雅地关闭线程池。
一. 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线程池相关推荐
- java如何关闭线程池_如何优雅的关闭Java线程池
⾯试中经常会问到,创建⼀个线程池需要哪些参数.线程池的工作原理,却很少会问到线程池如何安全关闭的. 也正是因为⼤家不是很关注这块,即便是⼯作三四年的⼈,也会有因为线程池关闭不合理,导致应用⽆法正常st ...
- parallelstream启动的线程数_高并发与多线程网络学习笔记(三)线程组和线程池
线程组 线程组的作用是:可以批量管理线程或线程组对象,有效地对线程或线程组对象进行组织. 构造函数 ThreadGroup(String name)//默认parent为当前线程组 ThreadGro ...
- java如何阻塞和同步_同步与异步,阻塞与非阻塞
今天早上关注了这个问题,刚抽出时间大概整理下,以下仅是个人理解: 一定要多看几遍代码并结合文字理解下 引0.从I/O说起 这些概念之所以容易令人迷惑,在于很多人对I/O就没有清晰准确的理解,后面的理解 ...
- mysql5.6 线程池_[MySQL5.6] Percona Server 5.6.14的线程池浅析
Percona的线程池基本上是从Mariadb中引入,其实现思路也比较简单,就是在线程调度器那增加了一组新的回调函数.线程池可以有效改善在大并发下的性能: Thread pool的原理在Percona ...
- nginx没有worker进程_如何优雅地关闭worker进程?
点击上方"武培轩",选择"设为星标" 技术文章第一时间送达! 之前我们讲解 Nginx 命令行的时候,可以看到 Nginx 停止有两种方式,分别是 nginx ...
- java tcp 阻塞等待应答_面试常问!TCP 的三次握手与四次挥手理解
来源:青柚_ blog.csdn.net/qq_38950316/article/details/81087809 三次握手过程理解 四次挥手过程理解 常见面试题 先来张图! 序列号seq: 占4个字 ...
- java退出不报异常_如何优雅的处理异常(java)?
这篇文章应该可以解答你的疑问. Java中异常提供了一种识别及响应错误情况的一致性机制,有效地异常处理能使程序更加健壮.易于调试.异常之所以是一种强大的调试手段,在于其回答了以下三个问题:什么出了错? ...
- 线程打印_面试题:用程序实现两个线程交替打印 0~100 的奇偶数
作者:dadiyang来源:https://blog.csdn.net/dadiyang/article/details/88315124 面试场景 面试官:Java多线程了解吗?你给我写一下,起两个 ...
- python 常量池_聊一聊让我蒙蔽一晚上的各种常量池
在写之前我们先来看几个问题,假如你对这些问题已经很懂了的话,那大可不用看这篇文章,如果不大懂的话,那么可以看看我的想法. 问题1: public static void main(String[] a ...
最新文章
- 程序员为什么要单身?
- Android获取手机型号,系统版本,App版本号等信息
- Android性能优化典范
- Little Sub and Enigma
- 15行代码AC_ 【蓝桥杯】兴趣小组(解题报告+思考)
- jquery/js 点击空白区域隐藏某一个层/元素
- arm nodejs_ARM发布Cortex A78C增强版大核架构
- 21 SD配置-主数据-客户账户组分配编号范围
- 常见RPM,YUM,DNF指令
- 【python】Python的基本数据类型之数据转换
- Kubernetes 弃用 Docker !
- 俯瞰大雾弥漫下的鄱阳湖二桥
- 高等微積分(高木貞治) 1.4節 例2
- C#根据word模板生成word表格报表文档
- Markdown公式编辑总结
- python手绘图_用Python轻松实现手绘图效果
- c语言火柴棒编辑,【NOIP2008】火柴棒等式
- 【GPS】在线经纬度距离计算
- 计算机考研失败了还能找工作吗,考研失败了怎么办_考研失败还能找工作吗
- 计算机网络基本设备及网络拓扑图
热门文章
- 视图自己定义旋转动画 相似百度音乐
- Google LOGO现代舞舞蹈动画
- C语言中,两整数相除,若分母为零,则会出现怎样的结果???
- jQuery学习(一):鼠标移动显示大图
- 博客园-vb随笔列表
- 解决CentOS java环境不生效的问题
- 【报告分享】2022中国人工智能人才培养报告.pdf(附下载链接)
- 【干货】房地产基础知识及开发流程.pdf(附下载链接)
- 【白皮书分享】创新中国2030:释放技术红利,解锁增长动能-埃森哲.pdf(附下载链接)...
- 【报告分享】2021年30+精致女性人群需求洞察:“她”经济时代科技引领精致生活.pdf(附下载链接)...