ExecutorService 中 shutdown()、shutdownNow()、awaitTermination() 含义和区别
文章目录
- 一、方法说明
- 1、shutdown():停止接收新任务,原来的任务继续执行
- 2、shutdownNow():停止接收新任务,原来的任务停止执行
- 3、awaitTermination(long timeOut, TimeUnit unit):当前线程阻塞
- 二、区别
- 1、shutdown() 和 shutdownNow() 的区别
- 2、shutdown() 和 awaitTermination() 的区别
- 三、总结
ExecutorService
是 Java 提供的线程池,也就是说,每次我们需要使用线程的时候,可以通过 ExecutorService
创建线程。
使用 ExecutorService
类时,经常用到 shutdown()
、shutdownNow()
、awaitTermination()
3个方法,下面我们来说说它们的含义和三者的区别 。
一、方法说明
1、shutdown():停止接收新任务,原来的任务继续执行
英文原意:关闭,倒闭;停工。 这里的意思是 关闭线程池。与使用数据库连接池一样,每次使用完毕后,都要关闭线程池。
1、停止接收新的submit的任务;
2、已经提交的任务(包括正在跑的和队列中等待的),会继续执行完成;
3、等到第2步完成后,才真正停止;
2、shutdownNow():停止接收新任务,原来的任务停止执行
1、跟 shutdown() 一样,先停止接收新submit的任务;
2、忽略队列里等待的任务;
3、尝试将正在执行的任务interrupt中断;
4、返回未执行的任务列表;
说明:它试图终止线程的方法是通过调用 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()
不阻塞。
三、总结
1、优雅的关闭,用 shutdown()
2、想立马关闭,并得到未执行任务列表,用shutdownNow()
3、优雅的关闭,并允许关闭声明后新任务能提交,用 awaitTermination()
4、关闭功能 【从强到弱】 依次是:shuntdownNow() > shutdown() > awaitTermination()
ExecutorService 中 shutdown()、shutdownNow()、awaitTermination() 含义和区别相关推荐
- linux中shutdown命令的含义,Linux中的shutdown命令的详细解释
linxu下的shutdown命令是一个关机命令.下面由学习啦小编为大家整理了linux的shutdown命令的详细解释的相关知识,希望对大家有帮助! 一.Linux中的shutdown命令的详细解释 ...
- java线程池shutdown_关闭线程池的正确姿势,shutdown(), shutdownNow()和awaitTermination() 该怎么用?...
关闭线程池的正确姿势,shutdown(), shutdownNow()和awaitTermination() 该怎么用? ExecutorService 接口提供了三个方法用于手动关闭线程池,分别是 ...
- 在c语言中保留字是有专门含义和作用的,c语言中的关键字和保留字的区别?
c语言中的关键字和保留字的区别?以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! c语言中的关键字和保留字的区别? 在C语 ...
- fun在matlab里面啥意思_matlab 中.*和*有什么区别 matlab 中| || ~ 都是什么含义呢。谢谢~~...
导航:网站首页 > matlab 中.*和*有什么区别 matlab 中| || ~ 都是什么含义呢.谢谢~~ matlab 中.*和*有什么区别 matlab 中| || ~ 都是什么含义呢. ...
- 电脑切换用户关闭计算机会怎样,电脑中待机、关机、睡眠、注销、休眠、切换用户的含义和区别...
有一次在机房上课,老师安装了一个软件后,系统自动提示需要重启后才可以完全使用软件,但是鉴于机房设置的保护系统(只要关机后,系统就会恢复初始状态).所以坚决不可以重启,但是如果不重启的话,软件就无法正常 ...
- 云计算中laaS,PaaS和SaaS的含义及区别
laaS,PaaS和SaaS的含义及区别 SaaS: Software-as-a-Service(软件即服务)提供给客户的服务是运营商运行在云计算基础设施上的应用程序,用户可以在各种设备上通过客户端界 ...
- Java线程池ExecutorService中重要的方法
ExecutorService 介绍 ExecutorService是java线程池定义的一个接口,它在java.util.concurrent包中,在这个接口中定义了和后台任务执行相关的方法. Ja ...
- C#中关键字ref与out的区别(转)
C#中关键字ref与out的区别(转) 在C#中,ref与out是很特殊的两个关键字.使用它们,可以使参数按照引用来传递. 总的来说,通常我们向方法中传递的是值.方法获得的是这些值的一个拷贝,然后使用 ...
- C++中struct和class关键字的区别
文章目录 1 C++中struct和class关键字的区别 1.1 类的关键字 1 C++中struct和class关键字的区别 1.1 类的关键字 C++中类的关键字: struct在C语言中已经有 ...
最新文章
- JS每日一题: 小程序页面之间如何通信?
- [leetcode] 144.二叉树的前序遍历
- 线性规划的matlab实现
- 玩转Google开源C++单元测试框架Google Test系列
- hihocoder #1617 : 方格取数(dp)
- opencv3.1.0 编译H3516A 成功后调用时出现的问题
- 新华三杯考前突击---Day2---IPV6技术篇
- html+jQuery实现拖动滑块图片拼图验证码插件,移动端适用
- 计量芯片HLW8032在充电桩设备中的典型应用
- 新店铺怎么做?淘宝店铺如何引流做好基础销量?
- C++ STL map插入效率优化
- 如何解除电子书DRM限制
- 词典GoldenDict
- 【图深度学习】简单图的定义以及各类衍生图
- HTML爱心代码超好看
- Vue Vant点赞效果
- Java 开发工程师常用软件和网站
- 基于51单片机的火灾报警器
- centos7下RabbitMQ的安装
- COT:chain of thought