最近在看并发编程,在使用到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
版权声明:本文为博主原创文章,转载请附上博文链接!
分享到:
相关推荐
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-...
部分手机在fastboot模式下在win10(8代CPU)上使用USB3.0接口连接会显示 press any key to shutdown解决方法: 下载修复文件到电脑,右键管理员运行后即可完美解决
它可以没有用户登录时,或当计算机是在暂停的节能模式,在计划的时间关闭电脑。它为您提供了不同的方式来安排您的需求,如每天,每周只有一次关闭事件。在关机,它可以清理回收站,临时文件,IE缓存,ie浏览器的...
解决方法: 进入dos: 以DBA用户登录,具体命令是 sqlplus /NOLOG SQL>connect sys/change_on_install as sysdba 提示:已成功 SQL>shutdown normal 提示:数据库已经关闭 已经卸载数据库 ORACLE 例程已经关闭 ...
Oracle initialization or shutdown in progress 是oracle误删除文件所造成的sqlplus不能登陆的问题 正确,经验。
2.shutdown how=SHUT_WR(关闭写端)可以保证对等方接收到一个EOF字符(FIN段),而不管是否有其他进程已经打开了套接字(shutdown并没采用引用计数)。 而close需要等待套接字引用计数减为0时才发送FIN段。也就是说...
shutdown自动关机很好用
shutdown.rar
SHUTDOWN-定时开机关机 SHUTDOWN-定时开机关机 SHUTDOWN-定时开机关机 SHUTDOWN-定时开机关机 SHUTDOWN-定时开机关机
ShutDown Expert ShutDown Expert ShutDown Expert
Shutdown Timer Classic 是一个小巧的 Windows 应用程序,它允许您设置一个计时器,该计时器将关闭,重新启动,休眠,睡眠或锁定您的计算机。它是完全免费和开源的,并且不使用互联网。随时为 GitHub 上的项目做贡献...
列举讲解shutdown的具体应用 shutdown命令的相关参数
电脑设置定时关机,shutdown命令详解
vista 关机命令 shutdownvista 关机命令 shutdownvista 关机命令 shutdownvista 关机命令 shutdownvista 关机命令 shutdown
Oracle数据库startup和shutdown方式
人小鬼大 感受Windows中Shutdown命令魅力 WINDOWS XP的关机中。...在Windows XP的运用中,如果我们能很好的利用这个工具,这对我们的工作是大有益处的。作为Shutdown.exe的运用,我想作以下几点来讲。
此bat文件解决小米miui链接电脑进入fastboot模式时出现press any key to shutdown的问题,以管理员身份运行即可
Linux系统关机命令shutdown introduction
Shutdown用法详解及应用Shutdown使您能够一次关闭
C#shutdown.rarC#shutdown.rarC#shutdown.rarC#shutdown.rar