(转)threadPoolExecutor 中的 shutdown() 、 shutdownNow() 、 awaitTermination() 的用法和区别

最近在看并发编程,在使用到ThreadPoolExecutor时,对它的三个关闭方法(shutdown()、shutdownNow()、awaitTermination())产生了兴趣,同时又感到迷惑。查了些资料,自己写了测试代码,总算有了个比较清晰的认识。下面一起来看看这三个方法:

shutdown()
将线程池状态置为SHUTDOWN,并不会立即停止:

停止接收外部submit的任务
内部正在跑的任务和队列里等待的任务,会执行完
等到第二步完成后,才真正停止
shutdownNow()
将线程池状态置为STOP。企图立即停止,事实上不一定:

跟shutdown()一样,先停止接收外部提交的任务
忽略队列里等待的任务
尝试将正在跑的任务interrupt中断
返回未执行的任务列表
它试图终止线程的方法是通过调用Thread.interrupt()方法来实现的,但是大家知道,这种方法的作用有限,如果线程中没有sleep 、wait、Condition、定时锁等应用, interrupt()方法是无法中断当前的线程的。所以,ShutdownNow()并不代表线程池就一定立即就能退出,它也可能必须要等待所有正在执行的任务都执行完成了才能退出。

但是大多数时候是能立即退出的

awaitTermination(long timeOut, TimeUnit unit)
当前线程阻塞,直到

等所有已提交的任务(包括正在跑的和队列中等待的)执行完
或者等超时时间到
或者线程被中断,抛出InterruptedException
然后返回true(shutdown请求后所有任务执行完毕)或false(已超时)

实验发现,shuntdown()和awaitTermination()效果差不多,方法执行之后,都要等到提交的任务全部执行完才停。
1
shutdown()和shutdownNow()的区别
从字面意思就能理解,shutdownNow()能立即停止线程池,正在跑的和正在等待的任务都停下了。这样做立即生效,但是风险也比较大;
shutdown()只是关闭了提交通道,用submit()是无效的;而内部该怎么跑还是怎么跑,跑完再停。
1
2
Between client threads and thread pool there is a queue of tasks. When your application shuts down, you must take care of two things: what is happening with queued tasks and how already running tasks are behaving (more on that later). Surprisingly many developers are not shutting down thread pool properly or consciously. There are two techniques: either let all queued tasks to execute (shutdown()) or drop them (shutdownNow()) - it totally depends on your use case.

shutdown()和awaitTermination()的区别
shutdown()后,不能再提交新的任务进去;但是awaitTermination()后,可以继续提交。
awaitTermination()是阻塞的,返回结果是线程池是否已停止(true/false);shutdown()不阻塞。
1
2
总结
优雅的关闭,用shutdown()
想立马关闭,并得到未执行任务列表,用shutdownNow()
优雅的关闭,并允许关闭声明后新任务能提交,用awaitTermination()
关闭功能 【从强到弱】 依次是:shuntdownNow() > shutdown() > awaitTermination()
————————————————
版权声明:本文为CSDN博主「shenlan_____」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u012168222/article/details/52790400

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/330403.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HDU2049(错列排序)

国庆期间,省城HZ刚刚举行了一场盛大的集体婚礼,为了使婚礼进行的丰富一些,司仪临时想出了有一个有意思的节目,叫做"考新郎",具体的操作是这样的: 首先,给每位新娘打扮得几乎一模一样,并盖上大大的红盖头随机坐成一排; 然后,让各位新郎寻找自己的新娘.每人只准找一个,…

厉害了,Servlet3的异步处理机制

转载自 厉害了,Servlet3的异步处理机制Servlet3发布好几年了,又有多少人知道它的新特性呢?下面简单介绍下。 主要增加了以下特性: 1、异步处理支持 2、可插性支持 3、注解支持,零配置,可不用配置web.xml ..…

(转)Elasticsearch 聚合查询、桶聚合、管道聚合及复合查询

转自: https://blog.csdn.net/zx711166/article/details/81906881 聚合查询 聚合是一种基于查询条件对数据进行分桶、计算的方法。 聚合可以嵌套,由此可以组合复杂的操作(Bucketing 聚合可以包含 sub-aggregation)。 聚合的三种…

3种常见的Class级别的错误

转载自 3种常见的Class级别的错误ClassNotFoundException 很明显,这个错误是 找不到类异常,即在当前classpath路径下找不到这个类。 ClassNotFoundException继承了Exception,是必须捕获的异常,所以这个异常一般发生在显示加载类的…

(转)es 聚合查询并返回每个组的数据

转自: https://blog.csdn.net/ywdhzxf/article/details/84878760 需求 我现在是有一个这样的需求, 我需要在es里面按照 cityarea 进行分组(group by), 并且每个 cityarea的组 需要展示 按照时间排序的前10条, 状态全部为1的数据 实现 { "query": {…

java程序员被误导的一个概念,Set也可以有序

转载自 java程序员被误导的一个概念,90%人不知道我们经常听说List是有序且重复的,Set是无序不重复的。这里有个误区,这里说的顺序有两个概念,一是按添加的顺序排列,二是按自然顺序a-z排列。Set并不是无序的&#xff0c…

es7 bulk api 批量插入es

post localhost:9200/cuiji/_doc/_bulk {"index":{}} {"RCRD_ID":"RD_TR_001", "CUST_NUM":"CUSTA", "LAST_MODIFY_TIME":"2020-07-18 00:00:50", "NOTE_CONTENT":"催记A001"} {…

TreeSet的null值与元素类型的约束

一、TreeSet Java的TreeSet通过TreeMap来实现,具有自然排序的功能。 在默认情况下,元素不允许为null值,元素必须是相同类型,元素必须实现了Comparable接口;否则会出现java.lang.ClassCastException。 可以通过设置Comp…

转-HTTPClient调用https请求,通过基本认证用户名密码(Basic Auth)

转自: https://blog.csdn.net/qq_27605885/article/details/79131483 本文来源是Apache官网例子:http://hc.apache.org/httpcomponents-client-4.5.x/httpclient/examples/org/apache/http/examples/client/ClientAuthentication.java 之前找过很多博客…

你知道void和Void的区别吗

转载自 你知道void和Void的区别吗 区别 void 用于无返回值的方法定义。 Void Void是void的包装方法,和其他基础类型的包装方法不同是Void不能被实例化,Void还可用于一直返回null的方法或者返回null的泛型。 代码示例

httpclient es action_request_validation_exception validation failed 1 no requests added原因和解决方法

【README】 批量插入数据到es,报错如下; action_request_validation_exception validation failed 1 no requests added 原因: 在请求头设置报文为 json格式,但报文并非json格式, 如 java字符串: post l…

POJ1321(DFS)

Problem Descrption 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的…

关于java流的几个概念:IO、BIO、NIO、AIO,有几个人全知道?

转载自 关于java流的几个概念:IO、BIO、NIO、AIO,有几个人全知道? 关于同步、阻塞的知识我之前的文章有介绍,所以关于流用到这些概念与之前多线程用的概念一样。 下面具体来看看java中的几种流 IO/BIO BIO就是指IO,即…

转:字符串和编码

转: https://www.liaoxuefeng.com/wiki/1016959663602400/1017075323632896 字符编码 我们已经讲过了,字符串也是一种数据类型,但是,字符串比较特殊的是还有一个编码问题。 因为计算机只能处理数字,如果要处理文本&…

HDU2067(卡特兰数)

Problem Descrption 小兔的叔叔从外面旅游回来给她带来了一个礼物,小兔高兴地跑回自己的房间,拆开一看是一个棋盘,小兔有所失望。不过没过几天发现了棋盘的好玩之处。从起点(0,0)走到终点(n,n)的最短路径数是C(2n,n),现在小兔又想…

JAVA元注解@interface详解(@Target,@Documented,@Retention,@Inherited)

转载自 JAVA元注解interface详解(Target,Documented,Retention,Inherited) jdk1.5起开始提供了4个元注解,用来定义自定义注解的注解,它们分别是: Target 指定注解使用的目标范围(类、方法、字段等),其参考值…

转:字符编码笔记:ASCII,Unicode 和 UTF-8

转: http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html 作者: 阮一峰 日期: 2007年10月28日 今天中午,我突然想搞清楚 Unicode 和 UTF-8 之间的关系,就开始查资料。 这个问题比我想象的复杂&am…

HDU2068(错列排序)

Problem Descrption 今年暑假杭电ACM集训队第一次组成女生队,其中有一队叫RPG,但做为集训队成员之一的野骆驼竟然不知道RPG三个人具体是谁谁。RPG给他机会让他猜猜,第一次猜:R是公主,P是草儿,G是月野兔;第二次猜&…

Java码农必须掌握的循环删除List元素的正确方法

转载自 Java码农必须掌握的循环删除List元素的正确方法 首先看下下面的各种删除list元素的例子 public static void main(String[] args) {List<String> list new ArrayList<>(Arrays.asList("a1", "ab2", "a3", "ab4",…

es dsl多条件组合查询(转)

【README】在不评分的情况下&#xff0c; 推荐使用filter 过滤查询&#xff0c;因为不评分&#xff0c;查询性能优于评分性能&#xff1b; 转&#xff1a;https://www.elastic.co/guide/cn/elasticsearch/guide/current/combining-queries-together.html 下面截图是我认为最有…