问题
如何关闭ExecutorService
答案
如何关闭ExecutorService
当没有任务可以处理的时候,ExecutorService
也不会自动被销毁,它将会等待着新的任务提交.
在一些场景,这是非常有用的,比如说在编译时期还不能明确有多少任务要处理.
但是如果app已经执行完毕,不再需要执行任何方法,那么这个时候,ExecutorService
没有被销毁就会让JVM
无法退出.
为了优雅的退出ExecutorService
,我们可以使用shutdown()
方法或者shutdownNow()
方法.
-
shutdown方法并不会使得
ExecutorService
立即被销毁,它将使得ExecutorService
不再接收新的任务,等待所有任务执行完后,再退出ExecutorService
.
executorService.shutdown();
-
shutdownNow方法尝试去立即销毁
ExecutorService
,但是不能保证所有运行的线程在同一时刻停止.这个方法返回一个等待被执行的任务的列表,取决于开发者如何处理这些任务.
List<Runnable> notExecutedTasks = executorService.shutDownNow();
关闭ExecutorService
的一个更好方式(Oracle官方推荐)是使用上面的两种方法,再加上awaitTermination方法.使用这种方式,ExecutorService
首先将会停止接收新提交的任务,等待一段时间来让未完成的线程继续执行,如果到达指定时间还没有执行完,则强制退出ExecutorService
.
executorService.shutdown();
try {
if (!executorService.awaitTermination(800, TimeUnit.MILLISECONDS)) {
executorService.shutdownNow();
}
} catch (InterruptedException e) {
executorService.shutdownNow();
}