美文网首页
问题:如何关闭ExecutorService

问题:如何关闭ExecutorService

作者: Dream_Lin | 来源:发表于2019-01-22 17:48 被阅读4次

问题

如何关闭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();
}

相关文章

网友评论

      本文标题:问题:如何关闭ExecutorService

      本文链接:https://www.haomeiwen.com/subject/jhjrjqtx.html