码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-10-20 10:33:28      阅读:244      评论:0      收藏:0      [点我收藏+]

标签:多线程   异常处理

问题描述:

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


问题分析与定位:


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

java.lang.NoClassDefFoundError: Could not initialize class

可是,为什么程序会“卡住”呢?



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

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

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

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

这就是程序为什么一直卡住的根本原因!



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


线程内解决:

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


线程外解决:

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

可以通过这个方法来实现线程代码之外处理未捕获异常!




本文出自 “学海无涯 心境无限” 博客,请务必保留此出处http://zhangfengzhe.blog.51cto.com/8855103/1704416

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

标签:多线程   异常处理

原文地址:http://zhangfengzhe.blog.51cto.com/8855103/1704416

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!