在 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);
但同样,在一般情况下,这并非微不足道。
添加回答
举报
0/150
提交
取消