为了账号安全,请及时绑定邮箱和手机立即绑定

Java 并行流中的异常传播

Java 并行流中的异常传播

桃花长相依 2023-06-08 20:56:17
在 Akka in Action 书中它说异常几乎不可能在开箱即用的线程之间共享,除非您准备构建大量基础设施来处理这个问题。而且,据我所知,如果并行线程中发生异常,它将传播给调用者。如果这种机制可行,为什么不用常规线程来实现呢?我错过了什么吗?编辑:我说的是这样的可能性: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:
查看完整描述

1 回答

?
互换的青春

TA贡献1797条经验 获得超6个赞

主要区别在于,虽然各个 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);

但同样,在一般情况下,这并非微不足道。


查看完整回答
反对 回复 2023-06-08
  • 1 回答
  • 0 关注
  • 140 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信