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)文章
SpringBoot?MongoCustomConversions自定義轉(zhuǎn)換方式
這篇文章主要介紹了SpringBoot?MongoCustomConversions自定義轉(zhuǎn)換方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-08-08
Spring boot使用spring retry重試機制的方法示例
這篇文章主要介紹了Spring boot使用spring retry重試機制的方法示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01
SpringBoot 整合Redisson重寫cacheName支持多參數(shù)的案例代碼
這篇文章主要介紹了SpringBoot 整合Redisson重寫cacheName支持多參數(shù),本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2024-01-01
java.net.ConnectException異常的正確解決方法(親測有效!)
java.net.ConnectException異常是與網(wǎng)絡(luò)相關(guān)的最常見的Java異常之一,建立從客戶端應(yīng)用程序到服務(wù)器的TCP連接時,我們可能會遇到它,這篇文章主要給大家介紹了關(guān)于java.net.ConnectException異常的正確解決方法,需要的朋友可以參考下2024-01-01
Springboot使用RabbitMQ實現(xiàn)關(guān)閉超時訂單(示例詳解)
介紹了如何在Spring Boot項目中使用RabbitMQ實現(xiàn)訂單的延時處理和超時關(guān)閉,通過配置RabbitMQ的交換機、隊列和綁定關(guān)系,以及編寫監(jiān)聽方法,實現(xiàn)了訂單數(shù)據(jù)的發(fā)送和延時消費,感興趣的朋友一起看看吧2025-01-01

