在 Akka in Action 書中它說異常幾乎不可能在開箱即用的線程之間共享,除非您準備構(gòu)建大量基礎(chǔ)設(shè)施來處理這個問題。而且,據(jù)我所知,如果并行線程中發(fā)生異常,它將傳播給調(diào)用者。如果這種機制可行,為什么不用常規(guī)線程來實現(xiàn)呢?我錯過了什么嗎?編輯:我說的是這樣的可能性: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() 產(chǎn)生多個線程,當(dāng)其中任何一個拋出 RuntimeException 時,該異常仍會在主線程上捕獲,這似乎與書中的觀點相反。編輯 2:
1 回答

互換的青春
TA貢獻1797條經(jīng)驗 獲得超6個贊
主要區(qū)別在于,雖然各個 Stream 中間體可以并行運行,但僅在遇到終端操作時才對其求值;這使它成為一個虛擬連接點。
即,類似的東西也是可能的
try { Thread concurrent = new Thread(runnable); concurrent.start(); concurrent.join(); } catch (ExceptionThrownInThread ex) {}
然而,在一般情況下——這幾乎就是 Akka 的編程模型——你有
yourMessenger.registerCallbacks(callbacks); new Thread(yourMessenger).start();
現(xiàn)在,回調(diào)最終將從您創(chuàng)建的線程中調(diào)用,但沒有結(jié)構(gòu)將其執(zhí)行作為一個整體進行包裝;那么誰會抓住這個例外呢?
我對 Akka 了解不夠,但是在 projectreactor 中Publisher
,你可以注冊一個錯誤處理程序,如
Mono<Result> mono = somethread.createResult().onError(errorHandler);
但同樣,在一般情況下,這并非微不足道。
添加回答
舉報
0/150
提交
取消