Java ExecutorService 中的 awaitTermination()
原理
1、方法示例
boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException;
2、参数说明:
timeout
:最大等待时间,表示阻塞等待的时长。
unit
:时间单位,如 TimeUnit.SECONDS、TimeUnit.MILLISECONDS 等。
返回值:
true
:所有任务在规定时间内已执行完毕。
false
:超时仍有任务未完成。
抛出异常:InterruptedException,当等待过程被中断时抛出。
3、工作原理:
- 在调用
awaitTermination()
之前,必须调用shutdown()
或shutdownNow()
,这会通知线程池停止接收新任务,但允许已提交的任务继续执行。
- 所有提交的任务执行完毕,方法立即返回 true;
- 超过指定的等待时间,方法返回 false;
- 线程在等待过程中被中断,抛出 InterruptedException。
如果在指定时间内未完成所有任务,可以选择调用 shutdownNow() 来强制关闭正在执行的任务。
4、使用示例
ExecutorService executor = Executors.newFixedThreadPool(10);
executor.shutdown(); // 停止接收新任务
try {
// 等待最多60秒,看看是否所有任务都完成
if (!executor.awaitTermination(60, TimeUnit.SECONDS)) {
executor.shutdownNow(); // 如果未完成,则强制关闭
if (!executor.awaitTermination(60, TimeUnit.SECONDS)) {
System.err.println("线程池未能正常关闭");
}
}
} catch (InterruptedException e) {
executor.shutdownNow(); // 等待过程中被中断则强制关闭
Thread.currentThread().interrupt(); // 恢复中断状态
}