在使用ThreadPoolExecutor时,有3个关闭方法(shutdown()
、shutdownNow()
、awaitTermination()
),查了下资料对ThreadPoolExecutor的3个方法有了大概的认知。
shutdown():
将线程池状态设置为shutdown,并不会立即停止:
1).停止接收外部submit的任务。
2).会执行完内部正在跑的任务和队列里等待的任务。
3).执行完所有任务才关闭。
shutdownNow():
将线程池状态设置为stop,想立即停止:
1).shutdownNow和shutdown一样,先停止接收外部提交的任务。
2).忽略正在队列等待的任务。
3).尝试将在跑的任务Thread.interrupt()
中断(如果线程中没有sleep 、wait、Condition、定时锁等应用, interrupt()方法是无法中断当前的线程的)。
4).返回未执行的记录列表。
awaitTermination(long timeOut,TimeUnit unit):
当前线程阻塞:
1).等所有已提交的任务执行完。
2).等超时时间到。
3).或者线程被中断,抛出InterruptedException然后返回true(shutdown所有任务执行完毕的时候)或false(超时)。
shutdown()和shutdownNow()的区别:
shutdown()只是关闭了提交通道,用submit()是无效的;而内部该怎么跑还是怎么跑,跑完再停。
shutdownNow()能立即停止线程池,正在跑的和正在等待的任务都停下了。这样做立即生效,但是风险也比较大。
shutdown()和awaitTermination()的区别:
shutdown()后,不能再提交新的任务进去;但是awaitTermination()后,可以继续提交。
awaitTermination()是阻塞的,返回结果是线程池是否已停止(true/false);shutdown()不阻塞。
总结
1).优雅的关闭,用shutdown()。
2).想立马关闭,并得到未执行任务列表,用shutdownNow()。
3).优雅的关闭,并允许关闭声明后新任务能提交,用awaitTermination()。