猿问

Java 并行流中的异常传播

在 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:


桃花长相依
浏览 141回答 1
1回答

互换的青春

主要区别在于,虽然各个 Stream 中间体可以并行运行,但仅在遇到终端操作时才对其求值;这使它成为一个虚拟连接点。即,类似的东西也是可能的try&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;Thread&nbsp;concurrent&nbsp;=&nbsp;new&nbsp;Thread(runnable); &nbsp;&nbsp;&nbsp;&nbsp;concurrent.start(); &nbsp;&nbsp;&nbsp;&nbsp;concurrent.join(); }&nbsp;catch&nbsp;(ExceptionThrownInThread&nbsp;ex)&nbsp;{}然而,在一般情况下——这几乎就是 Akka 的编程模型——你有yourMessenger.registerCallbacks(callbacks); new&nbsp;Thread(yourMessenger).start();现在,回调最终将从您创建的线程中调用,但没有结构将其执行作为一个整体进行包装;那么谁会抓住这个例外呢?我对 Akka 了解不够,但是在 projectreactor 中Publisher,你可以注册一个错误处理程序,如Mono<Result>&nbsp;mono&nbsp;=&nbsp;somethread.createResult().onError(errorHandler);但同样,在一般情况下,这并非微不足道。
随时随地看视频慕课网APP

相关分类

Java
我要回答