如题,我的线程类如下:
public class CreatePdfInvoiceThread extends Thread { public void run() { String invno = null; while (true) { try { Calendar calen = Calendar.getInstance(); int hour = calen.get(Calendar.HOUR_OF_DAY); //业务逻辑代码... } catch (Exception ex) { Logger.getRootLogger().error("error invno ==" + String.valueOf(invno), ex); Sendmail.getInstance().send("kaoii pdf invoice thread occured exception!!!"+ String.valueOf(invno), ex.getMessage(), ServiceConfig.getProperty("MAIL.TO")); } } } }
在另一个类中启动.
CreatePdfInvoiceThread invThread = new CreatePdfInvoiceThread(); invThread.start();
感觉这个不会停止的,而且就是有任何异常也应该会被扑捉,发送邮件给运维人员的.
但线程莫名结束了.....
日志如下:
[INFO ] 2014-07-14 18:02:08.707 method:com.report.ExportReport.createPdfInvoice(ExportReport.java:85)
commfee:0.0
这句是线程里调用的一个类输出的,正常运行下去的话,后面还有几句的,但后面什么都没有了.到此结束.
我用jvisualvm抓了一个快照,JVM里已经没有这个线程类CreatePdfInvoiceThread 了.
问了运维,14号18点多服务器和DB都是正常的.
百思不得其解,求大牛解答~
内存用光光了,导致的?!
2L说的有道理哦,可以在外层再加个try catch,这样吞噬掉异常
try{
Logger.getRootLogger().error("error invno ==" + String.valueOf(invno), ex);
Sendmail.getInstance().send("kaoii pdf invoice thread occured exception!!!"+ String.valueOf(invno), ex.getMessage(), ServiceConfig.getProperty("MAIL.TO"));
}catch(exception ex){}
内存有的,这个功能当做一个独立的应用和另一个应用部署在同一个tomcat下的,另一个到今天17号都是正常运行的.
Logger.getRootLogger().error("error invno ==" + String.valueOf(invno), ex);
Sendmail.getInstance().send("kaoii pdf invoice thread occured exception!!!"+ String.valueOf(invno), ex.getMessage(), ServiceConfig.getProperty("MAIL.TO"));
这两条语句抛了异常就会终止。
这个确实是一个可能.
照这个思路,应该就是第一句打logger出错了?
正常来说,我服务器空间足够的情况下,第一句出错的可能比较低吧.还有什么情况可能会导致写log出错呢.
@fans123:
try {
Calendar calen = Calendar.getInstance();
int hour = calen.get(Calendar.HOUR_OF_DAY);
//业务逻辑代码...
} catch (Exception ex) {}
抛出了 catch 不了的异常,也会终止。
@Launcher: 您是说还有Error吗,那我是不是要扑捉Throwable了.
@fans123: 这我就不知道了,对 java 的异常机制不熟悉。所有的只是基于推测,在 C++ 中是最可能发生的,在 C# 中基本很少见。
@fans123:
error时jvm没了,谁来捕获呢
多半是处理异常的语句又出了异常
您可以把try catch 放在while的外面,加个finally block,在里面加下调试信息,如果还是意外退出,没出发现任何迹象,您再考虑下您的线程是真的启动过么。
猜测1:抛出的是error不是exception (概率不大)
猜测2:catch里面的语句抛出exception,比如发送邮件网络问题等。
猜测3:jvm内存不足,是jvm内存,不是PC内存
可能是java.util.Date, java.util.Calendar都不是线程安全的导致的!
[INFO ] 2014-07-14 18:02:08.707 method:com.report.ExportReport.createPdfInvoice(ExportReport.java:85) commfee:0.0
----这句也不是你catch里的输出。
线程中止的原因很多,直接kill掉,还有楼上说的jvm不行了,自己退出了
出异常了,自然要退出了
LZ你好,这种情况我们也遇见过。
第一仔细检查你的逻辑代码当中是否会照成线程卡死,
情况一:读数据库卡死
情况二:线程锁卡死
情况三:死循环
以上情况都是程序运行一段时间后才会出现的问题
第二异常没有捕获到,可能是你爹异常代码里面又发生的异常导致连锁反应。
LZ放出来这段代码 并不能帮助我们帮你分析问题,很有可能是逻辑代码出现问题。
以前我遇见的问题是因为GO TO语句导致线程死锁
和代码当中出现漏洞引起的死运行 仔细检查下 和线程相关的所有代码 一定要细心
感谢回复.
情况一:读数据库卡死.
--确实有部分sql没有加with(nolock) 标示.这是一个比较老的工程了.就平时出问题时修修补补.平时会有deadlocked报出,但不会导致线程终止.
情况二:线程锁卡死.
--这个功能是当做一个独立的工程部署的,里面就运行这一个线程.没有其他逻辑和这个线程抢资源的.您说的线程卡死是指什么,我抓了一个JVM的快照,JVM里已经没有这个线程了,应该已经结束了.
情况三:死循环
--这个线程本身就是个死循环,不过中间是有sleep的,每隔一段时间就会运行.
出现这种问题最好加上全局未处理异常
目前看来异常只有可能是在异常处理部分抛出了异常导致程序down。按照楼主说的中间有sleep,那有没有可能把线程放到timer里执行呢?