Java主線程捕獲子線程異常的實現
正常情況下使用多線程出現異常時,都是按照單個任務去處理異常,在線程間不需要通信的情況下,任務之間互不影響,主線程也不必知道子線程是否發(fā)成異常。
那么只需要處理子線程異常即可
Task.Run(() =>
{
try
{
throw new Exception("error message");
}
catch (Exception ex)
{
Console.WriteLine("出現異常,記錄日志,業(yè)務回滾等等...");
}
});
但是在某些復雜業(yè)務中,多個線程在執(zhí)行過程中如果出現異常需要反饋給主線程,所以需要在子線程出現異常時通知主線程。
實現方式:
- 使用
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í)行結果:

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

