Java 在异常时将可完成的未来连接到当前线程

Java 在异常时将可完成的未来连接到当前线程,java,completable-future,Java,Completable Future,我有一个方法调用,它分派请求并异步等待响应。一旦收到响应,它将触发回调以处理结果 但是,如果出现故障(错误响应或其他故障),我希望在调用线程中重新显示异常 dispatcher.dispatch(json) .whenComplete((responseString, throwable) -> responses.handle(responseString)); 在lambda表达式中重新引用异常显然不起作用,因为它位于不同的线程中。因此,一些类似于 dispatcher.dispat

我有一个方法调用,它分派请求并异步等待响应。一旦收到响应,它将触发回调以处理结果

但是,如果出现故障(错误响应或其他故障),我希望在调用线程中重新显示异常

dispatcher.dispatch(json)
.whenComplete((responseString, throwable) -> responses.handle(responseString));
在lambda表达式中重新引用异常显然不起作用,因为它位于不同的线程中。因此,一些类似于

dispatcher.dispatch(json)
.whenComplete((responseString, throwable) -> responses.handle(responseString))
.joinExceptionally(throwable -> throw throwable);

此呼叫也不能被阻止。换句话说,一旦可完成的未来异常完成,是否可以在调用线程中抛出异常而不阻塞?

这基本上是不可能的

您希望异步处理该请求,因此必须在另一个线程中处理该请求。您还希望在调用线程中抛出异常,因此该异常必须在同一个线程中抛出(因为异常是通过调用堆栈传播的),该线程与以前的需求一致


通常,分派器仅用于分派请求,不应用于处理异常。最好使用
CompletableFuture
的内置功能来处理异常,如
CompletableFuture.handle(bifunction作为旁白:
我有一个方法调用,它分派一个请求并异步等待响应
这几乎总是设计中的一个错误。如果您所做的只是等待另一个线程完成,那么您也可以在执行的第一个线程中执行任务,从而节省使用单独线程的开销nd IPC。@markspace这不是设计中的错误。主线程需要继续执行其他任务。一旦其他任务完成,响应就会出现。很抱歉,如果不清楚,那么当主线程同时抛出异步作业异常时,主线程如何继续执行其他任务?