首页 新闻 会员 周边 捐助

Java线程加了死循环还终止,可能是什么导致.

0
悬赏园豆:100 [待解决问题]

如题,我的线程类如下:

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都是正常的.

百思不得其解,求大牛解答~

fans123的主页 fans123 | 初学一级 | 园豆:102
提问于:2014-07-17 16:47
< >
分享
所有回答(11)
0

内存用光光了,导致的?!

 

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){}

Alex_QY1987 | 园豆:1888 (小虾三级) | 2014-07-17 17:06

内存有的,这个功能当做一个独立的应用和另一个应用部署在同一个tomcat下的,另一个到今天17号都是正常运行的.

支持(0) 反对(0) fans123 | 园豆:102 (初学一级) | 2014-07-17 17:28
0

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"));

 

这两条语句抛了异常就会终止。

Launcher | 园豆:45050 (高人七级) | 2014-07-17 17:10

这个确实是一个可能.

照这个思路,应该就是第一句打logger出错了?

正常来说,我服务器空间足够的情况下,第一句出错的可能比较低吧.还有什么情况可能会导致写log出错呢.

支持(0) 反对(0) fans123 | 园豆:102 (初学一级) | 2014-07-17 17:27

@fans123: 

try {
                 Calendar calen = Calendar.getInstance();
               int hour = calen.get(Calendar.HOUR_OF_DAY);
               //业务逻辑代码...
            } catch (Exception ex) {}

抛出了 catch 不了的异常,也会终止。

支持(0) 反对(0) Launcher | 园豆:45050 (高人七级) | 2014-07-17 17:50

@Launcher: 您是说还有Error吗,那我是不是要扑捉Throwable了.

支持(0) 反对(0) fans123 | 园豆:102 (初学一级) | 2014-07-17 18:10

@fans123: 这我就不知道了,对 java 的异常机制不熟悉。所有的只是基于推测,在 C++ 中是最可能发生的,在 C# 中基本很少见。

支持(0) 反对(0) Launcher | 园豆:45050 (高人七级) | 2014-07-18 09:23

@fans123: 

error时jvm没了,谁来捕获呢

支持(0) 反对(0) 沧海一滴 | 园豆:211 (菜鸟二级) | 2014-07-22 13:45
0

多半是处理异常的语句又出了异常

大佛脚下 | 园豆:416 (菜鸟二级) | 2014-07-18 14:06
0

您可以把try catch 放在while的外面,加个finally block,在里面加下调试信息,如果还是意外退出,没出发现任何迹象,您再考虑下您的线程是真的启动过么。

go搬运工 | 园豆:210 (菜鸟二级) | 2014-07-20 08:21
0

猜测1:抛出的是error不是exception    (概率不大)

猜测2:catch里面的语句抛出exception,比如发送邮件网络问题等。

猜测3:jvm内存不足,是jvm内存,不是PC内存

衍悔 | 园豆:261 (菜鸟二级) | 2014-07-21 11:23
0

可能是java.util.Date, java.util.Calendar都不是线程安全的导致的!

egghead | 园豆:202 (菜鸟二级) | 2014-07-22 08:31
0

[INFO ] 2014-07-14 18:02:08.707 method:com.report.ExportReport.createPdfInvoice(ExportReport.java:85) commfee:0.0

----这句也不是你catch里的输出。

线程中止的原因很多,直接kill掉,还有楼上说的jvm不行了,自己退出了

沧海一滴 | 园豆:211 (菜鸟二级) | 2014-07-22 13:43
0

出异常了,自然要退出了

ㄓㄤㄑㄧㄤ | 园豆:251 (菜鸟二级) | 2014-07-22 19:06
0

LZ你好,这种情况我们也遇见过。

第一仔细检查你的逻辑代码当中是否会照成线程卡死,

 情况一:读数据库卡死

 情况二:线程锁卡死

 情况三:死循环  

以上情况都是程序运行一段时间后才会出现的问题

第二异常没有捕获到,可能是你爹异常代码里面又发生的异常导致连锁反应。

LZ放出来这段代码 并不能帮助我们帮你分析问题,很有可能是逻辑代码出现问题。

以前我遇见的问题是因为GO TO语句导致线程死锁

和代码当中出现漏洞引起的死运行   仔细检查下  和线程相关的所有代码 一定要细心

落幕残情 | 园豆:34 (初学一级) | 2014-07-23 00:22

感谢回复.

情况一:读数据库卡死.

--确实有部分sql没有加with(nolock) 标示.这是一个比较老的工程了.就平时出问题时修修补补.平时会有deadlocked报出,但不会导致线程终止.

情况二:线程锁卡死.

--这个功能是当做一个独立的工程部署的,里面就运行这一个线程.没有其他逻辑和这个线程抢资源的.您说的线程卡死是指什么,我抓了一个JVM的快照,JVM里已经没有这个线程了,应该已经结束了.

情况三:死循环 

--这个线程本身就是个死循环,不过中间是有sleep的,每隔一段时间就会运行.

支持(0) 反对(0) fans123 | 园豆:102 (初学一级) | 2014-07-29 17:39
0

出现这种问题最好加上全局未处理异常

JeffWong | 园豆:2328 (老鸟四级) | 2014-07-25 20:44
0

目前看来异常只有可能是在异常处理部分抛出了异常导致程序down。按照楼主说的中间有sleep,那有没有可能把线程放到timer里执行呢?

robertzhu | 园豆:202 (菜鸟二级) | 2014-08-26 21:20
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册