CompletableFuture.exception与执行者

vis*_*shr 4 asynchronous nonblocking completable-future

CompletableFuture.exceptionally()方法采用lambda,但该方法没有采用自定义Executor的风格,甚至没有采用“ ... Async”风格的风格。

lambda可以在哪个执行器上运行?运行原始CompletableFuture引发异常的是同一执行者吗?或者(如果是这种情况,我会感到惊讶)是commonPool吗?

rad*_*tao 5

表单JDK错误讨论CompletableFuture.exceptionally可以在主线程上执行

CompletableFuture.exceptionally 不采用Executor参数,因为它不是为了异步执行异常任务而设计的。

如果从属任务尚未完成,那么例外任务将在从属任务完成的同一线程上完成。

如果从属任务已完成,则异常任务将在执行异常调用的线程上完成。

对于任何非异步执行,如thenAccept,都会发生相同的行为。

为了确保异常任务在执行程序线程池中的线程上执行,则必须使用 whenCompleteAsynchandleAsync并传入执行程序。


Chr*_* S. 5

请注意,从 JDK 12 开始,有CompletionStage.exceptionallyAsync(并且exceptionallyAsync需要一个Executor)。