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主线程捕获子线程异常内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Spring Boot Admin 监控指标接入Grafana可视化的实例详解
Spring Boot Admin2 自带有部分监控图表,如图,有线程、内存Heap和内存Non Heap,这篇文章主要介绍了Spring Boot Admin 监控指标接入Grafana可视化,需要的朋友可以参考下2022-11-11idea查看properties中文变成unicode码的解决方案
这篇文章主要介绍了idea查看properties中文变成unicode码的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教2024-06-06SpringBoot中的@RequestMapping注解的用法示例
@RequestMapping注解是SpringBoot中最常用的注解之一,它可以帮助开发者定义和处理HTTP请求,本篇文章我们将详细为大家介绍如何使用SpringBoot中的@RequestMapping注解,感兴趣的同学跟着小编一起来学习吧2023-06-06Java中replace、replaceAll和replaceFirst函数的用法小结
相信会java的同学估计都用过replace、replaceAll、replaceFirst这三个函数,可是,我们真的懂他们吗?下面通过这篇文章大家再来好好学习学习下这几个函数。2016-09-09
最新评论