shutdown() 、 shutdownNow() 、 awaitTermination() 区别

Java并发编程中在使用到ThreadPoolExecutor时,对它的三个关闭方法(shutdown()、shutdownNow()、awaitTermination())的异同点如下:


shutdown()

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

  1. 停止接收外部submit的任务

  2. 内部正在跑的任务和队列里等待的任务,会执行完

  3. 等到第二步完成后,才真正停止


shutdownNow()

将线程池状态置为STOP。企图立即停止,事实上不一定:

  1. 跟shutdown()一样,先停止接收外部提交的任务

  2. 忽略队列里等待的任务

  3. 尝试将正在跑的任务interrupt中断

  4. 返回未执行的任务列表

它试图终止线程的方法是通过调用Thread.interrupt()方法来实现的,但是大家知道,这种方法的作用有限,如果线程中没有sleep 、wait、Condition、定时锁等应用, interrupt()方法是无法中断当前的线程的。所以,ShutdownNow()并不代表线程池就一定立即就能退出,它也可能必须要等待所有正在执行的任务都执行完成了才能退出。
但是大多数时候是能立即退出的


awaitTermination(long timeOut, TimeUnit unit)

当前线程阻塞,直到

  1. 等所有已提交的任务(包括正在跑的和队列中等待的)执行完

  2. 或者等超时时间到

  3. 或者线程被中断,抛出InterruptedException
    然后返回true(shutdown请求后所有任务执行完毕)或false(已超时)

shuntdown()和awaitTermination()效果差不多,方法执行之后,都要等到提交的任务全部执行完才停。


shutdown() 和 shutdownNow()的区别

从字面意思就能理解,shutdownNow()能立即停止线程池,正在跑的和正在等待的任务都停下了。这样做立即生效,但是风险也比较大;
shutdown()只是关闭了提交通道,用submit()是无效的;而内部该怎么跑还是怎么跑,跑完再停。

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()的区别

  1. shutdown()后,不能再提交新的任务进去;但是awaitTermination()后,可以继续提交。

  2. awaitTermination()是阻塞的,返回结果是线程池是否已停止(true/false);shutdown()不阻塞。


总结

  1. 优雅的关闭,用shutdown()

  2. 想立马关闭,并得到未执行任务列表,用shutdownNow()

  3. 优雅的关闭,并允许关闭声明后新任务能提交,用awaitTermination()

ps:关闭功能 【从强到弱】 依次是:shuntdownNow() > shutdown() > awaitTermination()
awaitTermination并不是用来关闭线程池,它只是用来检测timeout时间后线程池是否关闭。
一般在调用shutdown()方法后调用

最后给大家推荐几个优秀的职位,详情请查看链接地址:【HBLOG10月内推】让你的职业生涯腾飞!

相关推荐

  • 如何使用 Promise 去控制并发请求?
  • 使用一致性哈希让数据均匀分布
  • 如何优雅的创建线程?
  • 一站式图计算平台 GraphScope,支持图分析、图的交互式查询和图学习任务
  • 使用React和Node构建实时协作的白板应用
  • 聊一聊 ReentrantLock 类的一些玩法
  • 大视觉语言模型基准数据集ReForm-Eval:新瓶装旧酒,给旧有的基准数据集换个形式就能用来评估新的大视觉语言模型
  • GPT-4V被曝离谱bug:突然执行神秘代码,空白图片读出打折信息,网友们都看呆了
  • 时序LightTS: 轻量采样的MLP结构网络
  • [开源]MIT开源协议,开箱即用的 layui vue 3.0 企业级前端模板
  • Linux 内核崩了,只因拔掉罗技的 USB 接收器.....
  • 开源联合、聚力共赢丨2023 CCF中国开源大会会议通知
  • 百亿级推送系统的容灾建设与实践
  • 如何让 ChatGPT 更好地思考,以获得更佳的输出效果
  • 1019.AI日报:Midjourney 正式发布了图像放大功能(2倍和4倍)
  • Llama 2第一、GPT-4第三!斯坦福大模型最新测评出炉
  • 上海新基建行动方案发布;传OpenAI寻求860亿美元估值;杨立昆反对过早监管AI丨AIGC大事日报
  • OPPO Find N3真机首发体验!地表最强拍照折叠屏?分屏操作颠覆安卓底层
  • 靠挖掘这个细分市场,他一个人赚了20万,还只是纯利润
  • 向量数据库不是一个单独的数据库分类