miller
发布于

ExecutorService awaitTermination

https://zhuanlan.zhihu.com/p/602451856

终止 ExecutorService 的一个最佳实践就是,shutdown 和 shutdownNow 两个方法一起,并结合 awaitTermination 来实现超时等待。

executorService.shutdown();
try {
    if (!executorService.awaitTermination(800, TimeUnit.MILLISECONDS)) {
        executorService.shutdownNow();
    } 
} catch (InterruptedException e) {
    executorService.shutdownNow();
}

调用 shutdown,阻止新提交任务,并让等待队列中的任务执行完成
调用 awaitTermination(),保证等待队列中的任务最多执行 800 ms,以防止执行任务时间太长或被阻 塞,而导致 ExecutorService 不能被销毁。
在 awaitTermination 等待 800 ms 后,ExecutorService 中还有任务没执行完,则调用 shutdownNow 强行终止,以释放 ExecutorService 资源。
上面代码执行 awaitTermination 时所在的线程也有可能被 interrupt,因此需要 catch InterruptedException。

浏览 (404)
点赞
收藏
评论