Java主线程捕获子线程异常的实现

 更新时间:2024年04月16日 10:55:29   作者:子时已过  
本文主要介绍了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主线程捕获子线程异常内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java反射设置/获取对象属性值三种方式

    Java反射设置/获取对象属性值三种方式

    这篇文章主要给大家介绍了关于Java反射设置/获取对象属性值的三种方式,反射机制的用途非常多,比如获取方法,属性名和属性值等,甚至可以获取标签等标签属性,需要的朋友可以参考下
    2023-11-11
  • Spring Boot Admin 监控指标接入Grafana可视化的实例详解

    Spring Boot Admin 监控指标接入Grafana可视化的实例详解

    Spring Boot Admin2 自带有部分监控图表,如图,有线程、内存Heap和内存Non Heap,这篇文章主要介绍了Spring Boot Admin 监控指标接入Grafana可视化,需要的朋友可以参考下
    2022-11-11
  • idea查看properties中文变成unicode码的解决方案

    idea查看properties中文变成unicode码的解决方案

    这篇文章主要介绍了idea查看properties中文变成unicode码的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • SpringBoot中的@RequestMapping注解的用法示例

    SpringBoot中的@RequestMapping注解的用法示例

    @RequestMapping注解是SpringBoot中最常用的注解之一,它可以帮助开发者定义和处理HTTP请求,本篇文章我们将详细为大家介绍如何使用SpringBoot中的@RequestMapping注解,感兴趣的同学跟着小编一起来学习吧
    2023-06-06
  • Java并发编程之闭锁与栅栏的实现

    Java并发编程之闭锁与栅栏的实现

    这篇文章主要介绍了Java并发编程之闭锁与栅栏的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • 详谈fastjson将对象格式化成json时的两个问题

    详谈fastjson将对象格式化成json时的两个问题

    下面小编就为大家带来一篇详谈fastjson将对象格式化成json时的两个问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • Java中replace、replaceAll和replaceFirst函数的用法小结

    Java中replace、replaceAll和replaceFirst函数的用法小结

    相信会java的同学估计都用过replace、replaceAll、replaceFirst这三个函数,可是,我们真的懂他们吗?下面通过这篇文章大家再来好好学习学习下这几个函数。
    2016-09-09
  • Java实现简单点餐系统

    Java实现简单点餐系统

    这篇文章主要为大家详细介绍了Java实现简单点餐系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • Java日常练习题,每天进步一点点(6)

    Java日常练习题,每天进步一点点(6)

    下面小编就为大家带来一篇Java基础的几道练习题(分享)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望可以帮到你
    2021-07-07
  • Springboot actuator生产就绪功能实现解析

    Springboot actuator生产就绪功能实现解析

    这篇文章主要介绍了Springboot actuator生产就绪功能实现解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05

最新评论