亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 177 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號