Java主线程捕获子线程异常的实现
正常情况下使用多线程出现异常时,都是按照单个任务去处理异常,在线程间不需要通信的情况下,任务之间互不影响,主线程也不必知道子线程是否发成异常。
那么只需要处理子线程异常即可
Task.Run(() =>
{
try
{
throw new Exception("error message");
}
catch (Exception ex)
{
Console.WriteLine("出现异常,记录日志,业务回滚等等...");
}
});
但是在某些复杂业务中,多个线程在执行过程中如果出现异常需要反馈给主线程,所以需要在子线程出现异常时通知主线程。
实现方式:
- 使用
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);
}
}
执行结果:

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主线程捕获子线程异常内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
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的交换机、队列和绑定关系,以及编写监听方法,实现了订单数据的发送和延时消费,感兴趣的朋友一起看看吧2025-01-01


最新评论