一次线上多线程程序问题排查

问题描述:java

周一发现线上的一个程序从上周日一直运行“卡住”了十多个小时,原本是10MIN一次更新数据的,致使如今数据一直停留在过去,而且因为程序一直“卡住”不报错,使得咱们收不到报警短信通知。并发


问题分析与定位:ide


根据报错日志来看,是一个类A的static区域发生了异常,因为在static区域并无catch住这个异常,致使类A没法加载成功,JAVA异常打印以下:
spa

java.lang.NoClassDefFoundError: Could not initialize class线程

但是,为何程序会“卡住”呢?日志



接下来,分析了下,程序的运行结构,发现:
it

程序会开启N个线程去并发请求数据,而后利用JOIN的方式,合并线程,待全部线程都请求完后,再去执行其余步骤。在线程任务类中的run方法利用到了那个类A!更加剧要的是,在对类A方法调用也没有任何异常的处理!
io

也就是说这N个线程运行run方法,就会抛出异常,线程就会终结!class

线程已经死掉了,但是JOIN还在等待着线程进行合并,一直等待着他们活过来!请求

这就是程序为何一直卡住的根本缘由!



可见,咱们在对待线程的异常处理上,应该当心,若是咱们不处理,那么这个线程可能死掉,咱们还不知道!那么处理线程异常的方式有哪些呢?


线程内解决:

线程是一段独立的代码,有问题,应该让它本身来CATCH住处理,即应该注意在run方法中处理异常。


线程外解决:

Thread方法提供了一个方法:setUncaughtExceptionHandler

能够经过这个方法来实现线程代码以外处理未捕获异常!

相关文章
相关标签/搜索