CompletableFuture发生异常时未完成,allOf回调块不执行问题咨询
问题根因
你对allOf的基础逻辑理解是正确的:所有入参的CompletableFuture进入终态(包括异常完成状态)后,allOf返回的Future确实会进入终态。但你忽略了一个核心规则:如果任意一个入参的Future是异常完成的,allOf本身返回的Future也会被标记为异常完成状态。
你代码中使用的thenRun属于正常完成回调,仅会在Future无异常正常结束时触发,异常完成场景下不会执行,所以你看不到回调里的输出。
修复方案
你可以根据业务需求选择以下两种方案:
方案1:使用支持异常场景的回调方法
如果希望不管子任务是否异常,回调都能执行,可以替换thenRun为whenComplete,它会在Future进入任意终态时触发:
CompletableFuture.allOf(r1, r2, r3).whenComplete((unused, throwable) -> { // 可选:throwable不为空时可处理子任务抛出的异常 System.out.println(Thread.currentThread()+" --- End."); });
方案2:提前处理子任务异常,让allOf正常完成
如果希望allOf始终正常完成触发thenRun,可以给每个子任务加上exceptionally异常处理逻辑,把异常转换为正常返回值:
CompletableFuture<String> r1 = CompletableFuture.supplyAsync(() -> { try{ Thread.sleep(1000); throw new RuntimeException("blahh !!!"); }catch (Exception e) { throw new RuntimeException(e); } // 异常时返回默认值,保证Future正常完成 }).exceptionally(e -> "error_result");
修改后运行代码即可看到回调的输出内容。
内容的提问来源于stack exchange,提问作者V1666
相关产品推荐
相关产品推荐

