0 0

Java线程加了死循环,但异常终止,可能是什么导致.0

如题,我的线程类如下:

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

百思不得其解,求大牛解答~
2014年7月17日 16:51

4个答案 按时间排序 按投票排序

0 0

Sendmail 如果有异常可没有捕获啊!
java方法即使未声明异常,也是有可能有异常抛出的。

2014年8月04日 16:13
0 0

线程一定要对uncaughtException进行处理,如果uncaughtException是ThreadDeath的一个实例的话是不会抛出或者答应任何东西的,线程直接终止了!如果该线程没有设置,但有设置线程组的话会调用组策略对uncaughtException进行处理。
最后,除了你有更好的方法或者特殊需求,否则一定要设置:

 public void setUncaughtExceptionHandler(UncaughtExceptionHandler eh) { 
        checkAccess();
        uncaughtExceptionHandler = eh;
    }

2014年7月18日 15:13
0 0

这样的代码意义不大,线程死循环,最大的坏处,就是导致cpu使用率居高不下,如果跟其他线程有竞争资源现象的话,则出现长时间不释放资源。造成死锁可能性大。单从这个类来看   不断循环,导致jvm堆内存不断攀升,full gc应该频率会加大,最终如果堆溢出,可能会出现线程退出。如果想知道退出原因,在thread启用前,添加异常捕获方法。
invThread.setUncaughtExceptionHandler(new UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread t, Throwable e) {
System.out.println(e);
}

2014年7月17日 23:55
0 0

java除了Exception还有Error。
你的代码只捕获Exception,如果出现Error线程也就退出了。
你可以获取Throwable,这样连Error也会获取。

2014年7月17日 17:42

相关推荐

Global site tag (gtag.js) - Google Analytics