Java主線程捕獲子線程異常的實現(xiàn)
正常情況下使用多線程出現(xiàn)異常時,都是按照單個任務(wù)去處理異常,在線程間不需要通信的情況下,任務(wù)之間互不影響,主線程也不必知道子線程是否發(fā)成異常。
那么只需要處理子線程異常即可
Task.Run(() => { try { throw new Exception("error message"); } catch (Exception ex) { Console.WriteLine("出現(xiàn)異常,記錄日志,業(yè)務(wù)回滾等等..."); } });
但是在某些復(fù)雜業(yè)務(wù)中,多個線程在執(zhí)行過程中如果出現(xiàn)異常需要反饋給主線程,所以需要在子線程出現(xiàn)異常時通知主線程。
實現(xiàn)方式:
- 使用
Task.WaitAll
,使主線程阻塞。
try { List<Task> tasks = new List<Task>(); tasks.Add(Task.Run(() => { throw new Exception("error message"); })); Task.WaitAll(tasks.ToArray()); } catch (AggregateException ex) { foreach (var except in ex.InnerExceptions) { Console.WriteLine(except.Message); } }
執(zhí)行結(jié)果:
2. 使用非阻塞Task.Factory.ContinueWhenAll
List<Task> tasks = new List<Task>(); tasks.Add(Task.Run(() => { throw new Exception("error message"); })); //Task.WaitAll(tasks.ToArray()); Task.Factory.ContinueWhenAll(tasks.ToArray(), t => { foreach (var task in t) { if (task.IsFaulted) { AggregateException aggEx = task.Exception; Console.WriteLine(aggEx.Message); } } });
打印結(jié)果:
One or more errors occurred. (error message)
到此這篇關(guān)于Java主線程捕獲子線程異常的實現(xiàn)的文章就介紹到這了,更多相關(guān)Java主線程捕獲子線程異常內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring?Cloud?Gateway?2.x跨域時出現(xiàn)重復(fù)Origin的BUG問題
這篇文章主要介紹了Spring?Cloud?Gateway?2.x跨域時出現(xiàn)重復(fù)Origin的BUG問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-04-04java反編譯工具jd-gui-osx?for?mac?M1芯片無法使用的問題及解決
這篇文章主要介紹了java反編譯工具jd-gui-osx?for?mac?M1芯片無法使用的問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01SpringBoot中@EnableAutoConfiguration和@Configuration的區(qū)別
這篇文章主要介紹了SpringBoot中@EnableAutoConfiguration和@Configuration的區(qū)別,@SpringBootApplication相當(dāng)于@EnableAutoConfiguration,@ComponentScan,@Configuration三者的集合,需要的朋友可以參考下2023-08-08SpringBoot利用Redis解決海量重復(fù)提交問題
本文主要介紹了SpringBoot利用Redis解決海量重復(fù)提交問題,介紹了三種常見的解決方案,包括使用Redis計數(shù)器,使用Redis分布式鎖和使用Redis發(fā)布/訂閱機制,感興趣的可以了解一下2024-03-03