`
Action-人生
  • 浏览: 105697 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

对它的三个关闭方法(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()是无效的;而内部该怎么跑还是怎么跑,跑完再停。
12


  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()不阻塞。

pool为java线程池
pool.shutdown();
pool.awaitTermination(1, TimeUnit.MINUTES);
awaitTermination 使用之前 必须先手动关闭线程池,否则一直会阻塞到超时为止
---------------------
作者:shenlan_____
来源:CSDN
原文:https://blog.csdn.net/u012168222/article/details/52790400
版权声明:本文为博主原创文章,转载请附上博文链接!
分享到:
评论

相关推荐

    oracle 中shutdown命令的实用

    Oracle 中 shutdown 命令的实用 ...shutdown 命令是一个非常重要的命令,它可以帮助DBA关闭数据库,以便进行维护、升级或解决问题。但是,shutdown 命令并不是一个简单的命令,它需要我们小心地执行,以避免出现问题。

    ExecutorService.shutdown()应该是在线程执行完毕后,才会去关闭

    当我们创建一个`ExecutorService`实例并提交任务时,我们可以通过调用`shutdown()`方法来关闭线程池。然而,标题指出"ExecutorService.shutdown()应该是在线程执行完毕后,才会去关闭",这意味着`shutdown()`方法...

    shutdown

    "shutdown"命令是操作系统中的一个核心功能,用于安全地关闭、重启或休眠计算机。在Windows系统中,它是一个非常实用的工具,尤其对于需要定时执行关机操作或者需要无人员值守时关闭计算机的情况。下面将详细介绍...

    Oracle initialization or shutdown in progress 解决方法

    Oracle Initialization or Shutdown in Progress 是 Oracle 中一个常见的问题,即 Oracle 初始化或关闭过程中无法连接数据库的问题。今天,我们将详细介绍这个问题的解决方法。 问题产生的原因 Oracle ...

    shutdown问题

    在IT领域,"shutdown"通常指的是操作系统中的关机或关闭命令。这个命令用于安全地停止计算机的操作,确保所有运行的应用程序、系统服务和文件系统都得以正确关闭,以避免数据丢失或系统损坏。当我们遇到“shutdown...

    vista 关机命令 shutdown

    - 在服务器环境中,`shutdown /g`命令非常有用,因为它可以在没有用户交互的情况下强制关闭系统。 #### 注意事项 - 当使用`/f`参数时,系统会强行终止所有进程,可能会导致未保存的数据丢失。 - 远程关机时,请...

    Application Shutdown

    标题"Application Shutdown"涉及到的是WPF应用程序关闭的处理机制,包括隐式和显式的关闭方法。在本文中,我们将深入探讨这两种方式以及如何在C#代码中实现它们。 1. **隐式Shutdown机制**: 隐式关闭通常发生在...

    2_ExecutorService源码阅读1

    isTerminated() 方法在所有任务执行完毕并成功关闭后返回 true,注意它在没有调用 shutdown 或 shutdownNow 之前总是返回 false。 **awaitTermination() 方法** 这个方法阻塞当前线程,直到所有在调用 shutdown() ...

    windows下的shutdown应用

    在 Windows 操作系统中,`shutdown` 命令是一个非常实用的工具,它允许用户通过命令行的方式控制计算机的关机、重启等操作。这对于自动化任务或者远程管理计算机尤其有用。本文将详细介绍 `shutdown` 命令的各个参数...

    定时关机命令shutdown

    在IT领域,定时关机命令“shutdown”是一个极为实用的功能,尤其对于系统管理员或需要自动化管理计算机的用户来说,它提供了高效且灵活的系统控制手段。本文将深入解析“shutdown”命令在Windows XP系统中的应用,...

    ShutDown Expert

    在日常的电脑使用中,我们往往需要进行定时关机、重启或休眠等操作,而“Shutdown Expert”正是一款专业的电脑关机管理工具,它能帮助用户高效地管理和控制计算机的电源状态。Shutdown Expert不仅提供了基本的关机...

    定时关机Shutdown Agent

    对于"定时关机Shutdown Agent"而言,它不仅仅是一个简单的定时关机工具,更是一个智能化的电脑管理助手。无论是家庭用户还是企业用户,都能从中得到便利。通过科学安排电脑的休息时间,用户不仅可以提高工作效率,还...

    ora-01033:oracle initialization or shutdown in progress 解决方法

    ### ora-01033: Oracle Initialization or Shutdown in Progress 解决方法 #### 一、问题背景及原因 **标题**: “ora-01033: Oracle initialization or shutdown in progress 解决方法” **描述**: “ora-01033: ...

    刷机时手机左上角出现press any key to shutdown 解决方法

    部分手机在fastboot模式下在win10(8代CPU)上使用USB3.0接口连接会显示 press any key to shutdown解决方法: 下载修复文件到电脑,右键管理员运行后即可完美解决

    PC Auto Shutdown V6.3 Keygen

    它可以没有用户登录时,或当计算机是在暂停的节能模式,在计划的时间关闭电脑。它为您提供了不同的方式来安排您的需求,如每天,每周只有一次关闭事件。在关机,它可以清理回收站,临时文件,IE缓存,ie浏览器的...

    linux shutdown关闭系统命令使用介绍.docx

    本篇文章将详细介绍`shutdown`命令的使用方法,帮助你理解如何正确地关闭和重启Linux系统,以保护用户数据的安全。 `shutdown`命令的基本语法是`shutdown [选项] [时间] [警告信息]`。这里的`选项`包括`-h`(halt,...

    ShutDown.rar 定时关机

    《定时关机软件ShutDown.rar的深度解析与应用指南》 在数字化生活的今天,电脑已经成为我们日常工作中不可或缺的一部分。然而,在长时间使用后,我们往往需要让计算机在特定时间自动关机,以便节省电力或避免因忘记...

    Shutdown用法详解及应用Shutdown使您能够一次关闭

    这个命令在系统管理员和日常用户中非常常见,因为它提供了灵活性和自动化的方式来管理计算机的关机过程。以下是对Shutdown命令的详细解释和应用场景: 1. **基本用法**: - `/s` 参数用于关闭计算机,例如 ...

    Linux上TCP的Shutdown和Close

    `close()`函数是用来完全关闭一个socket连接的,而`shutdown()`则是用来部分或完全停止数据传输的。在kernel-2.6.21版本的Linux中,如果TCP栈的读缓冲区还有未读取的数据,调用`close()`会立即向对端发送RST(复位)...

    shutdown.exe

    在Windows XP操作系统中,`shutdown.exe`是一个至关重要的命令行工具,它提供了对计算机的启动、关闭、重启等操作的控制。这个小程序的功能强大且灵活,是系统管理员和普通用户进行系统管理的重要手段之一。本文将...

Global site tag (gtag.js) - Google Analytics