知识卡片

择快不是择优

普通读书笔记卡 · 1542

内容

applyToEither 让两个 CompletionStage 比谁先返回结果,用先完成那个的结果执行回调,适合竞速请求、多副本读取等”要最快不是要最优”的场景。必须明确它面向”先正常完成”的结果:原书示例两个任务都正常返回,没覆盖异常、超时、慢任务占用资源不放的情况。它优化的是响应时间,不负责异常处理、超时兜底和资源清理,这些需业务代码单独编排。

参考来源

- 位置:《Java高并发核心编程.卷2,多线程、锁、JMM、JUC、高并发设计模式》第10章《CompletableFuture异步回调》10.4.1节《applyToEither()方法》(源文件:_epub-src/OEBPS/Text/chapter318.xhtml) - 结论依据:原文定义“两个CompletionStage谁返回结果的速度快,applyToEither()方法就用这个最快的CompletionStage的结果进行下一步(第三步)的回调操作”,示例中两个 supplyAsync 任务都是正常返回(10+10 与 100+100),没有展示任一任务异常或超时的处理路径,因此需要补充说明它只处理"先正常完成"的场景,异常/超时/清理需单独编排。 - 原始内容:两个CompletionStage谁返回结果的速度快,applyToEither()方法就用这个最快的CompletionStage的结果进行下一步(第三步)的回调操作……Function<T,R>接口既能接收输入参数又支持返回值。在applyToEither()方法中,Function的输入参数为前两个CompletionStage中返回快的那个结果,Function的输出值为最终的执行结果。