gpt4 book ai didi

java - Java 并行流中的异常传播

转载 作者:行者123 更新时间:2023-11-30 05:31:06 24 4
gpt4 key购买 nike

在《Akka in Action》书中这样说

Exceptions are almost impossible to share between threads out of the box, unless you are prepared to build a lot of infrastructure to handle this.

而且,据我了解,如果并行线程中发生异常,它将传播给调用者。如果这种机制可行,为什么不使用常规线程来实现呢?我错过了什么吗?

编辑:我正在谈论这样的可能性:

public static void count() {
long count = 0;
try {
count = IntStream.range(1, 10)
.parallel()
.filter(number -> f(number)).count();
} catch(RuntimeException e) {
/* handle */
}
System.out.println("Count - " + count);
}

public static boolean f(final int number) {
if(Math.random() < 0.1) {
throw new RuntimeException();
}
return true;
}

parallel() 生成多个线程,当其中任何一个线程抛出 RuntimeException 时,该异常仍然会在主线程上捕获,这似乎与书本上的观点相反。

编辑2:

Example with exception unable to propagate outside of a thread

最佳答案

主要区别在于,虽然各个 Stream 中间体可以并行运行,但它们仅在遇到终端操作时才进行评估;这使其成为虚拟连接点。

也就是说,同样的事情也可能发生

try {
Thread concurrent = new Thread(runnable);
concurrent.start();
concurrent.join();
} catch (ExceptionThrownInThread ex) {}

但是,在一般情况下 - 这几乎是 Akka 的编程模型 - 你有

yourMessenger.registerCallbacks(callbacks);
new Thread(yourMessenger).start();

现在,回调最终将从您创建的线程内调用,但没有结构来包装其整体执行;那么谁会捕获这个异常呢?

我不太了解Akka,但是在projectreactor的Publisher中,您可以注册一个错误处理程序,如

Mono<Result> mono = somethread.createResult().onError(errorHandler);

但是,在一般情况下,这并不是微不足道的。

关于java - Java 并行流中的异常传播,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57539336/

24 4 0
文章推荐: java - 按降序对数组进行排序并显示每次迭代的输出
文章推荐: java - 使用可比较的类保留 2D Arraylist 的原始索引
文章推荐: java - 合并两个 Observables/Singles 的方法有哪些?
文章推荐: javascript - 为什么 d3.select().style() 不适用于
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com