文章目录

  • 一、方法说明
    • 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() 含义和区别相关推荐

  1. linux中shutdown命令的含义,Linux中的shutdown命令的详细解释

    linxu下的shutdown命令是一个关机命令.下面由学习啦小编为大家整理了linux的shutdown命令的详细解释的相关知识,希望对大家有帮助! 一.Linux中的shutdown命令的详细解释 ...

  2. java线程池shutdown_关闭线程池的正确姿势,shutdown(), shutdownNow()和awaitTermination() 该怎么用?...

    关闭线程池的正确姿势,shutdown(), shutdownNow()和awaitTermination() 该怎么用? ExecutorService 接口提供了三个方法用于手动关闭线程池,分别是 ...

  3. 在c语言中保留字是有专门含义和作用的,c语言中的关键字和保留字的区别?

    c语言中的关键字和保留字的区别?以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! c语言中的关键字和保留字的区别? 在C语 ...

  4. fun在matlab里面啥意思_matlab 中.*和*有什么区别 matlab 中| || ~ 都是什么含义呢。谢谢~~...

    导航:网站首页 > matlab 中.*和*有什么区别 matlab 中| || ~ 都是什么含义呢.谢谢~~ matlab 中.*和*有什么区别 matlab 中| || ~ 都是什么含义呢. ...

  5. 电脑切换用户关闭计算机会怎样,电脑中待机、关机、睡眠、注销、休眠、切换用户的含义和区别...

    有一次在机房上课,老师安装了一个软件后,系统自动提示需要重启后才可以完全使用软件,但是鉴于机房设置的保护系统(只要关机后,系统就会恢复初始状态).所以坚决不可以重启,但是如果不重启的话,软件就无法正常 ...

  6. 云计算中laaS,PaaS和SaaS的含义及区别

    laaS,PaaS和SaaS的含义及区别 SaaS: Software-as-a-Service(软件即服务)提供给客户的服务是运营商运行在云计算基础设施上的应用程序,用户可以在各种设备上通过客户端界 ...

  7. Java线程池ExecutorService中重要的方法

    ExecutorService 介绍 ExecutorService是java线程池定义的一个接口,它在java.util.concurrent包中,在这个接口中定义了和后台任务执行相关的方法. Ja ...

  8. C#中关键字ref与out的区别(转)

    C#中关键字ref与out的区别(转) 在C#中,ref与out是很特殊的两个关键字.使用它们,可以使参数按照引用来传递. 总的来说,通常我们向方法中传递的是值.方法获得的是这些值的一个拷贝,然后使用 ...

  9. C++中struct和class关键字的区别

    文章目录 1 C++中struct和class关键字的区别 1.1 类的关键字 1 C++中struct和class关键字的区别 1.1 类的关键字 C++中类的关键字: struct在C语言中已经有 ...

最新文章

  1. JS每日一题: 小程序页面之间如何通信?
  2. [leetcode] 144.二叉树的前序遍历
  3. 线性规划的matlab实现
  4. 玩转Google开源C++单元测试框架Google Test系列
  5. hihocoder #1617 : 方格取数(dp)
  6. opencv3.1.0 编译H3516A 成功后调用时出现的问题
  7. 新华三杯考前突击---Day2---IPV6技术篇
  8. html+jQuery实现拖动滑块图片拼图验证码插件,移动端适用
  9. 计量芯片HLW8032在充电桩设备中的典型应用
  10. 新店铺怎么做?淘宝店铺如何引流做好基础销量?
  11. C++ STL map插入效率优化
  12. 如何解除电子书DRM限制
  13. 词典GoldenDict
  14. 【图深度学习】简单图的定义以及各类衍生图
  15. HTML爱心代码超好看
  16. Vue Vant点赞效果
  17. Java 开发工程师常用软件和网站
  18. 基于51单片机的火灾报警器
  19. centos7下RabbitMQ的安装
  20. COT:chain of thought

热门文章

  1. 水雨情数据采集RTU
  2. html中 label里for属性和form属性
  3. 详细实操分享,自媒体一个月收益6000多
  4. win本地配置docker环境
  5. Mysql-左右链接,慢查询,
  6. asp.net控件页面交互_ASP.NET Web窗体用户控件的基本交互
  7. 关于手机(智能机)游戏开发的43条小诀窍
  8. 国产蓝牙耳机哪个好?2023国产无线蓝牙耳机排名
  9. 网络对抗技术实验报告一
  10. Visual Studio Code介绍——工作区域