Java主線程捕獲子線程異常的實(shí)現(xiàn)
正常情況下使用多線程出現(xiàn)異常時(shí),都是按照單個(gè)任務(wù)去處理異常,在線程間不需要通信的情況下,任務(wù)之間互不影響,主線程也不必知道子線程是否發(fā)成異常。
那么只需要處理子線程異常即可
Task.Run(() => { try { throw new Exception("error message"); } catch (Exception ex) { Console.WriteLine("出現(xiàn)異常,記錄日志,業(yè)務(wù)回滾等等..."); } });
但是在某些復(fù)雜業(yè)務(wù)中,多個(gè)線程在執(zhí)行過(guò)程中如果出現(xiàn)異常需要反饋給主線程,所以需要在子線程出現(xiàn)異常時(shí)通知主線程。
實(shí)現(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主線程捕獲子線程異常的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Java主線程捕獲子線程異常內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java實(shí)現(xiàn)用位運(yùn)算維護(hù)狀態(tài)碼
位運(yùn)算是一種非常高效的運(yùn)算方式,在算法考察中比較常見(jiàn),那么業(yè)務(wù)代碼中我們?nèi)绾问褂梦贿\(yùn)算呢,感興趣的小伙伴快跟隨小編一起學(xué)習(xí)一下吧2024-03-03Spring?Cloud?Gateway?2.x跨域時(shí)出現(xiàn)重復(fù)Origin的BUG問(wèn)題
這篇文章主要介紹了Spring?Cloud?Gateway?2.x跨域時(shí)出現(xiàn)重復(fù)Origin的BUG問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-04-04springBoot使用JdbcTemplate代碼實(shí)例
這篇文章主要介紹了springBoot使用JdbcTemplate代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09java反編譯工具jd-gui-osx?for?mac?M1芯片無(wú)法使用的問(wèn)題及解決
這篇文章主要介紹了java反編譯工具jd-gui-osx?for?mac?M1芯片無(wú)法使用的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01SpringBoot中@EnableAutoConfiguration和@Configuration的區(qū)別
這篇文章主要介紹了SpringBoot中@EnableAutoConfiguration和@Configuration的區(qū)別,@SpringBootApplication相當(dāng)于@EnableAutoConfiguration,@ComponentScan,@Configuration三者的集合,需要的朋友可以參考下2023-08-08SpringBoot利用Redis解決海量重復(fù)提交問(wèn)題
本文主要介紹了SpringBoot利用Redis解決海量重復(fù)提交問(wèn)題,介紹了三種常見(jiàn)的解決方案,包括使用Redis計(jì)數(shù)器,使用Redis分布式鎖和使用Redis發(fā)布/訂閱機(jī)制,感興趣的可以了解一下2024-03-03