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);
});
一个选项是创建 Collection
个 Throwable
对象,当 CompletableFuture
完成时,您可以将异常添加到集合中(如果它不为空)。然后在您的主线程上,您可以轮询该集合。
Set<Throwable> exception = new CopyOnWriteArraySet<>();
CompletableFuture.runAsync(() -> {
}).whenComplete((method, e) -> exception.add(e));
另一种选择是将 whenComplete
与 ExecutorService
结合使用。如果您不使用 ExecutorService,这可能不起作用。这个想法是 whenComplete
将 return 在 mainThread
ExecutorService 上。
ExecutorService mainThread = Executors.newSingleThreadExecutor();
CompletableFuture.runAsync(() -> {
}).whenCompleteAsync((method, throwable) -> {
// throw or handle in some way on main thread
}, mainThread);
如何将 CompletableFuture.runAsync
中以下代码中遇到的异常传播到我的主线程?我想在主线程中捕获 IllegalStateException
。
CompletableFuture.runAsync(() -> {
// some business logic which needs to run indefinitely
}).exceptionally(ex -> {
// ex.printStackTrace();
throw new IllegalStateException("Failed to process", ex);
});
一个选项是创建 Collection
个 Throwable
对象,当 CompletableFuture
完成时,您可以将异常添加到集合中(如果它不为空)。然后在您的主线程上,您可以轮询该集合。
Set<Throwable> exception = new CopyOnWriteArraySet<>();
CompletableFuture.runAsync(() -> {
}).whenComplete((method, e) -> exception.add(e));
另一种选择是将 whenComplete
与 ExecutorService
结合使用。如果您不使用 ExecutorService,这可能不起作用。这个想法是 whenComplete
将 return 在 mainThread
ExecutorService 上。
ExecutorService mainThread = Executors.newSingleThreadExecutor();
CompletableFuture.runAsync(() -> {
}).whenCompleteAsync((method, throwable) -> {
// throw or handle in some way on main thread
}, mainThread);