多线程-捕捉子线程异常情况

Posted TGB-Earnest

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程-捕捉子线程异常情况相关的知识,希望对你有一定的参考价值。

一、问题描述


当我们在点击数据导出的时候,页面转圈,而且查看接口返回的是200,正常。

二、问题分析

我们发现在数据导出成功的话,它的状态是1,当数据导不成功,它的状态是0。

接下来我们看代码

我们发现它开启了一个异步线程进行导出数据,所以它一定是异步线程的时候报的错,然后异步线程没有抛出、日志也没有打印,主线程又运行完了。所以从表面上看,根本看不出它的问题在哪里。

三、问题解决

那我们就让它把具体的错误报出来,所以要更改代码。

		    new BuidExcelThread(zhitouService,aladBindBusinService, excellogsService,filename,user.getName(),param,filepath,AdvertMarketingContants.P4P_BAIHUI_EXCEL).excportBaihuiBinding(param,filename);


很显然通过看报错信息发现,数据多查出来了一条导致的,接下来我们就可以处理这条数据了。

五、优化方案

public class MyThread 

    public static void main(String[] args) 
        System.out.println("--------------主线程开始执行----------");

        try 
            new Thread(new  RunnableTread()).start();
         catch (Exception e) 
            System.out.println("进入到catch");
            e.printStackTrace();
        
        System.out.println("123");


    




class  MyUncaughtExceptionHandle implements Thread.UncaughtExceptionHandler

    @Override
    public void uncaughtException(Thread t, Throwable e) 
        System.out.println("caught" + e);
    


public class RunnableTread implements Runnable

    @Override
    public void run() 
        Thread.currentThread().setUncaughtExceptionHandler(new MyUncaughtExceptionHandle());
        System.out.println("-------------子线程开始执行----------");
        int i = 10 / 0;
        System.out.println(i);
        System.out.println("-------------子线程结束执行----------");
    

--------------主线程开始执行----------
123
-------------子线程开始执行----------
caughtjava.lang.ArithmeticException: / by zero

这样就可以捕获到异常了。

异常分为受检异常和非受检异常,在多线程的时候,run()没有办法向上显示抛出异常,
所以这个时候Thread线程中的异常处理就不是很好处理。

对于受检异常,一般都是在run方法体中捕获异常,然后进行对应的处理。
对于非受检异常,JVM会帮助我们捕获到,JVM就是通过Thread.UncaughtExceptionHandler类进行的。

当一个线程由于发生了非受检异常而终止时,JVM会使用Thread.gerUncaughtExceptionHandler()方法查看该线程上的UncaughtExceptionHandler,并调用他的uncaughtException()方法

当然,如果我只使用try…catch,并不会捕捉到子线程的异常。如果只使用thread.join,子线程报错了,主线程也不会等待子线程的执行。

以上是关于多线程-捕捉子线程异常情况的主要内容,如果未能解决你的问题,请参考以下文章

多线程情况下如何捕获线程中的异常?

多线程--课堂

3Java多线程-处理子线程异常

C#多线程开发-处理子线程中的异常

Java多线程之捕获子线程中的异常---面试经

C++11多线程中的detach()join()joinable()