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通过JavaMail发送邮件功能

    Java通过JavaMail发送邮件功能

    这篇文章主要为大家详细介绍了Java通过JavaMail发送邮件功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • SpringBoot MongoCustomConversions自定义转换方式

    SpringBoot MongoCustomConversions自定义转换方式

    这篇文章主要介绍了SpringBoot MongoCustomConversions自定义转换方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • IDEA如何加载resources文件夹下文件相对路径

    IDEA如何加载resources文件夹下文件相对路径

    这篇文章主要介绍了IDEA如何加载resources文件夹下文件相对路径问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • RocketMQ NameServer 核心源码解析

    RocketMQ NameServer 核心源码解析

    这篇文章主要为大家介绍了RocketMQ NameServer 核心源码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • Spring boot使用spring retry重试机制的方法示例

    Spring boot使用spring retry重试机制的方法示例

    这篇文章主要介绍了Spring boot使用spring retry重试机制的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01
  • Java字节流 从文件输入输出到文件过程解析

    Java字节流 从文件输入输出到文件过程解析

    这篇文章主要介绍了Java字节流 从文件输入 输出到文件过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • SpringBoot 整合Redisson重写cacheName支持多参数的案例代码

    SpringBoot 整合Redisson重写cacheName支持多参数的案例代码

    这篇文章主要介绍了SpringBoot 整合Redisson重写cacheName支持多参数,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2024-01-01
  • java教程之java继承示例详解

    java教程之java继承示例详解

    这篇文章主要介绍了java继承示例详解,需要的朋友可以参考下
    2014-04-04
  • java.net.ConnectException异常的正确解决方法(亲测有效!)

    java.net.ConnectException异常的正确解决方法(亲测有效!)

    java.net.ConnectException异常是与网络相关的最常见的Java异常之一,建立从客户端应用程序到服务器的TCP连接时,我们可能会遇到它,这篇文章主要给大家介绍了关于java.net.ConnectException异常的正确解决方法,需要的朋友可以参考下
    2024-01-01
  • Springboot使用RabbitMQ实现关闭超时订单(示例详解)

    Springboot使用RabbitMQ实现关闭超时订单(示例详解)

    介绍了如何在Spring Boot项目中使用RabbitMQ实现订单的延时处理和超时关闭,通过配置RabbitMQ的交换机、队列和绑定关系,以及编写监听方法,实现了订单数据的发送和延时消费,感兴趣的朋友一起看看吧
    2025-01-01

最新评论