Java ExecutorService 中的 `awaitTermination()` 原理

Java ExecutorService 中的 awaitTermination() 原理

1、方法示例

boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException;

2、参数说明:

timeout:最大等待时间,表示阻塞等待的时长。
unit:时间单位,如 TimeUnit.SECONDS、TimeUnit.MILLISECONDS 等。
返回值:
true:所有任务在规定时间内已执行完毕。
false:超时仍有任务未完成。
抛出异常:InterruptedException,当等待过程被中断时抛出。

3、工作原理:

  1. 调用 shutdown()
  • 在调用 awaitTermination() 之前,必须调用 shutdown() shutdownNow(),这会通知线程池停止接收新任务,但允许已提交的任务继续执行。
  1. 阻塞等待:
    调用 awaitTermination() 后,当前线程将会被阻塞,直到:
  • 所有提交的任务执行完毕,方法立即返回 true;
  • 超过指定的等待时间,方法返回 false;
  • 线程在等待过程中被中断,抛出 InterruptedException。
  1. 超时处理:

如果在指定时间内未完成所有任务,可以选择调用 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();  // 恢复中断状态
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值