CompletableFuture 中的异常传播 (java)

Exception propagation in CompletableFuture (java)

如何将 CompletableFuture.runAsync 中以下代码中遇到的异常传播到我的主线程?我想在主线程中捕获 IllegalStateException

CompletableFuture.runAsync(() -> {
        // some business logic which needs to run indefinitely
}).exceptionally(ex -> {
    // ex.printStackTrace();
    throw new IllegalStateException("Failed to process", ex);
});

一个选项是创建 CollectionThrowable 对象,当 CompletableFuture 完成时,您可以将异常添加到集合中(如果它不为空)。然后在您的主线程上,您可以轮询该集合。

        Set<Throwable> exception = new CopyOnWriteArraySet<>();

        CompletableFuture.runAsync(() -> {

        }).whenComplete((method, e) -> exception.add(e));

另一种选择是将 whenCompleteExecutorService 结合使用。如果您不使用 ExecutorService,这可能不起作用。这个想法是 whenComplete 将 return 在 mainThread ExecutorService 上。

        ExecutorService mainThread = Executors.newSingleThreadExecutor();
        
        CompletableFuture.runAsync(() -> {

        }).whenCompleteAsync((method, throwable) -> {
            // throw or handle in some way on main thread
        }, mainThread);