我们经常在项目中使用的线程池,但是是否关心过线程池的关闭呢,可能很多时候直接再项目中直接创建线程池让它一直运行当任务执行结束不在需要了也不去关闭,这其实是存在非常大的风险的,大量的线程常驻在后台对系统资源的占用是巨大的 ,甚至引发异常。所以在我们平时使用线程池时需要注意优雅的关闭,这样可以保证资源的管控。

在 Java 中和关闭线程池相关的方法主要有如下:
- void shutdown()
- List<Runnable> shutDownNow
- boolean awaitTermination
- boolean isShutDown
- boolean isTerminated
对于这些方法有着不同的使用和作用,下面我们真的会这些不同的方法做详细的介绍。
ShutDown
shutDown 方法从字面意思我们可以看到是停止关闭的意思,我们先来看下面的一段代码,首先我们通过 ThreadPoolExecutor 来创建一个容量是10的无界线程池,与 FixedThreadPool 类似的,这里手动创建可以更好地理解线程池的创建。在后我们提交一千个任务执行,再执行 shutdown 方法进行暂停。
public static void main(String[] args) throws InterruptedException {
ExecutorService service = new ThreadPoolExecutor(
10,
10,
0L,
TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<>());
for (int i = 0; i < 1000; i++) {
service.submit(() ->{
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
System.out.println("接受中断,不处理~~");
}
System.out.println("args = " + Arrays.deepToString(args)+ Thread.currentThread().getName());
});
}
service.shutdown();
}
- 我们可以看到结果所以线程会正常执行结束后再关闭线程池,对于 ShutDown 而言它可以安全的停止一个线程池,它有几个关键点
- ShutDown 会首先将线程设置成 SHUTDOWN 状态,然后中断所有没有正在运行的线程
- 正在执行的线程和已经在队列中的线程并不会被中断,说白了就是使用shutDown 方法其实就是要等待所有任务正常全部结束以后才会关闭线程池
- 调用 shutdown() 方法后如果还有新的任务被提交,线程池则会根据拒绝策略直接拒绝后续新提交的任务。
ShutDownNow
这个方法与上面方法相比较,直观就是 now ,即立即停止任务,
同样是上述案列,略作修改如下,
public static void main(String[] args) throws InterruptedException {
ExecutorService service = new ThreadPoolExecutor(
10,
10,
0L,
TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<>(1000));
for (int i = 0; i < 1000; i++) {
service.submit(() ->{
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
System.out.println("接受中断,结束线程~~");
//这里响应中断
return;
}
System.out.println("args = " + Arrays.deepToString(args)+ Thread.currentThread().getName());
});
}
final List<Runnable> runnables = service.shutdownNow();
System.out.println(runnables);
}
- 执行上述代码我们发现,当执行shutDownNow 方法后,会像全部正在运行的队列通知中断,正在运行的线程接收到中断信号后选择处理,而在队列中的全部取消执行转移到一个list队列中返回,如上述 List<Runnable> runnables ,这里记录了所有终止的线程
awaitTermination
- 这个方法并不是用来关闭线程池的,首先我们看一下这个方法的定义:
boolean awaitTermination_(long timeout, TimeUnit unit)_
- 可以看到这个方法有两个参数,timeout 表示等待的时间,unit 时间单位
- 这个方法的作用是,调用后等待timeout时间后,反馈线程池的状态,
- 等待期间(包括进入等待状态之前)线程池已关闭并且所有已提交的任务(包括正在执行的和队列中等待的)都执行完毕,相当于线程池已经“终结”了,方法便会返回 true;
- 等待超时时间到后,第一种线程池“终结”的情况始终未发生,方法返回 false;
- 等待期间线程被中断,方法会抛出 InterruptedException 异常。
- 上面代码可以修改来测试,这里不再粘贴代码
isShutDown
- isShutDown 方法正如名字,判断线程池是否停止,返回的是 Boolean 类型,如果已经开始停止线程池则返回 true 否则放回false
- 当调用了shutDown 或shutDownNow 时之后,会返回 true 不过需要注意,这时候只是代表线程池关闭流程的开始,并不是说线程池已经停止了
isTerminated
- 这个方法与上面的方法的区别就是这是正真检测线程池是否真的终结了
- 这不仅代表线程池已关闭,同时代表线程池中的所有任务都已经都执行完毕了,因为在调用 shutdown方法之后,线程池会继续执行里面未完成的任务,包括正在执行的任务和在任务队列中等待的任务。
- 如果调用了 shutdown 方法,但是有一个线程依然在执行任务,那么此时调用 isShutdown方法返回的是 true,而调用 isTerminated方法返回的便是 false,因为线程池中还有任务正在在被执行,线程池并没有真正“终结”。
- 直到所有任务都执行完毕了,调用 isTerminated()方法才会返回 true,这表示线程池已关闭并且线程池内部是空的,所有剩余的任务都执行完毕了。
作者:AnonyStar
原文链接:https://www.cnblogs.com/i-code/p/14024845.html
以上就是java 优雅关闭线程池的方案的详细内容,更多关于Java 关闭线程池的资料请关注其它相关文章!
相关推荐:
SEO立刻:快速提升网站排名,带你走在搜索引擎前沿,网站建设怎么推广好做
ChatGPT网络故障报告从协调世界时(UTC)晚上1107左右开始激增,15分钟内引发广泛关注,ai无视进化
ChatGPT怎么打开不了?全方位解决方案!,大庆ai
seo网站关键字排名优化,网站seo关键词 ,运动ai
SEO怎么排名?这5大技巧,轻松提升网站排名,人人都可ai
文章写作AI:让创作更高效、精准的智能助手
seo组建需要什么条件,seo建站的步骤 ,ai肌肉宝宝
360优化关键词-提升网站流量与排名的秘密武器,美拍ai
SEO功能:助力网站流量提升与品牌曝光,天津公司网站建设与维护
SEO阶段解析:从入门到精通,助你站稳搜索引擎的前沿,网站建设特定开发
优排软件:高效管理新天地,轻松提升工作效率,长葛外贸网站建设
seo都有什么问题,seo都有什么问题和答案 ,ai凯旋公主下载
seo系列什么意思,seo的分类 ,que n ai je
SEO能给企业带来什么价值,seo的影响 ,ai蓝衣美女
AI工具,让工作效率翻倍:AI工具教程全面解析
AI批量文章工具,让写作变得高效与轻松,cs机器人ai
SEO那么重要,企业如何通过它脱颖而出?,自媒体推广营销的概念
SEO收费如何选择合适的SEO服务,提升网站排名并增加曝光度,做网站优化哪家实惠
什么叫改写-解读“改写”背后的艺术与技巧,网站制作建设模板图片
SEO技巧提升网站流量和排名,助力企业快速崛起,ai080206.
BingAdapter设置数据后没有显示数据?解决方案在这里!,ai中如何把图变形
AI缩写文档:革新文档管理与自动化的未来,ai聊天中文
在线AI文章生成:内容创作新革命
什么是seo模型,seo模块总结 ,ai技术授课
怎么降低文章的AI生成率:打造更真实、更有价值的内容
SEO职责:为网站注入流量,提升品牌竞争力,拼多多女装关键词排名
AI免费生成:开启智能创作新纪元,助力你的创意无限可能
文章去AI回归创作的本真之美
Chat免费,让沟通无界限,尽享智能对话时代,ai没办法置顶
为什么说seo重要,为什么说seo重要一点 ,中通智能ai是什么意思
seo简报什么意思,seo工作汇报 ,万花筒 ai
在线AI写文:开启高效创作新时代
AI网页设计生成-智能化创造无限可能,ai机甲风背景音乐
seo相当于什么职业,seo相当于什么职业类别 ,usatisfy ai
SEO选择:如何挑选最合适的SEO优化策略?,wb免费刷粉网站推广
ChatGPT的梯子:突破网络壁垒,畅享智能对话的全新体验,ai的音标1001ai的音标
《收录情况:数字时代的网络信息检索与价值体现》,山东全域营销推广软件客服电话
SEO薪资这些,你也能月入过万!,天水网站建设公司
SEO开发:数字营销的核心驱动力,园区网站建设
SEO搜外:全球搜索引擎优化的秘密武器,如何选择网站建设类型呢
ChatGPT内部HTTP接口文档-为开发者提供高效便捷的AI服务接入方式,安屿ai
SEO提供:如何通过精准的SEO策略提升网站流量与品牌影响力,刷关键词排名立的火星
SEO优化中怎么找关键词:全面解析与实战技巧,ai2002.4.8
SEO怎么做才能提升网站流量与排名?这篇文章给你全攻略,铁岭定制网站推广公司电话
一键创作,助你轻松实现创意梦想,最低价刷粉网站推广
用AI写文章会不会查重率高?破解写作困扰的真相
SEO新站优化指南:快速提升排名的必备技巧,海珠网站推广哪家有名
seo诊断什么意思,seo诊断a5 ,约瑟夫ai
Bing搜索不能预览了?搜索引擎的新变革与挑战,ai制作一张窗花
撰写稿子的AI,写作的“超级助手”来了!