多线程-捕捉子线程异常情况
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,子线程报错了,主线程也不会等待子线程的执行。
以上是关于多线程-捕捉子线程异常情况的主要内容,如果未能解决你的问题,请参考以下文章