异常完成中间的 CompletableStage

Complete exceptionnally a middle CompletableStage

我正在执行如下繁重的工作:

try {
    Input in = initInput(param);
    Result re = doHeavyWork(in);
    saveResultSomewhereElse(re);
} catch (Exception e) {
    logExecutionError(e);
}

此外,有时 doHeavyWork 花费的时间太长,我们应该手动杀死它以节省资源。尽管如此,在那种情况下我还是想logExecutionError

将上面的代码块转化为CompletableFuture,我们可能会得到:

CompletableFuture.completedFuture(param)
                 .thenApply(initInput)
                 .thenApplyAsync(doHeavyWork, dedicatedExecutorService)
                 .thenApply(saveResultSomewhereElse)
                 .exceptionally(logExecutionError);

我的问题是,如果我终止dedicatedExecutorService,繁重的工作是否真的被杀死并且logExecutionError保证执行?

简答:没有。稍微长一点的答案是,没有好的方法可以终止 Java 中的线程,除非它合作。 Thread#stop should not be used and is not available on ExecutorService。当您关闭执行程序服务时,它可以通过中断作业来要求作业停止,但它不能强制它们停止。如果 doHeavyWork 处理中断并停止,那么它会正常退出或异常退出(取决于你如何设计它),然后下一阶段可以继续。

老实说,如果执行程序服务已停止,我不确定 thenApply 中的代码是否会 运行。就我个人而言,我会在不停止游泳池的情况下停下来打断 doHeavyWork。然后您就可以完全控制并可以保留其他任务的执行程序服务。