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

相关推荐

    Java多线程编程核心技术_完整版_java_

    Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在Java中,多线程主要通过继承Thread类或实现Runnable接口来实现。本教程《Java多线程编程核心技术》将...

    Java 多线程介绍

    Java线程有多种状态,主要包括: 1. **New(新建)**:当使用`new`关键字创建一个新的线程对象但尚未调用`start()`方法时,线程处于New状态。 2. **Runnable(可运行)**:一旦调用了`start()`方法,线程便进入...

    java线程.part001

    Java线程是并发编程的核心部分,它允许程序同时执行多个任务,从而提高系统资源的利用率和应用程序的响应速度。在Java中,线程是通过Java.lang.Thread类或实现Runnable接口来创建和管理的。理解Java线程的工作原理和...

    Java线程及多线程技术及应用.pdf

    9. 死循环和线程终止 在文档中,无论是MyThread还是MyRunable类的run()方法中,都存在一个无限循环,这可能造成线程永远无法结束。为了控制线程在特定条件下能够优雅地结束,可以使用共享变量配合volatile关键字进行...

    java多线程作业.docx

    ### Java多线程知识点解析 #### 一、Java多线程概述 Java作为一种现代编程语言,内置了对多线程的支持。多线程允许应用程序同时处理多个任务,从而提高程序的响应性和整体性能。在多线程环境中,一个程序可以包含...

    java线程实践练习

    在线程中,未捕获的异常会导致线程突然终止。可以通过设置`uncaughtExceptionHandler`来处理这类异常。 通过阅读《Java并发编程实战》和《Java多线程编程核心技术》这两本书,你可以深入了解以上知识点,并通过实践...

    Java 线程图形化理解

    4. **追踪线程堆栈**:查看每个线程的堆栈跟踪,可以帮助定位代码中的问题,比如死循环或者未捕获的异常。 "Java Current.jar"这个文件很可能是一个Java应用程序,它提供了一个图形化的用户界面,用于展示和分析...

    java多线程设计模式详解.rar

    一旦主线程抛出未捕获的异常,整个程序将终止,而其他线程可能还在运行。因此,线程应有适当的异常处理机制,如使用try-catch-finally结构,或者使用Thread.UncaughtExceptionHandler。 七、线程死锁 死锁是指两个...

    Java多线程技术(实验)

    - **死亡**:线程执行完毕或因异常终止。 ##### 4. 线程间的同步与通信 - **使用synchronized关键字**:可以通过将`synchronized`关键字应用于方法或代码块来确保线程安全。被`synchronized`修饰的方法或代码块在...

    java多线程编程总结.pdf

    Java线程具有几个状态:新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和死亡(Terminated)。线程生命周期的转换是由JVM调度管理的,线程通过调用start()方法启动进入就绪状态,随后由JVM调度...

    java多线程例子.pdf

    标题和描述中并未直接提供关于...以上知识点是根据给定的【部分内容】中的信息进行的提炼和总结,可能由于原始文本中OCR技术的误识别或遗漏,部分细节未能完全准确,但在大体上覆盖了Java多线程编程的核心概念和技术。

    Java线程总结教程

    ### Java线程总结教程知识点详解 #### 一、操作系统与多线程概念 - **多任务与分时操作系统**:现代操作系统(如Windows、Linux)能够实现多任务处理,即在用户看来似乎多个应用程序在“同时”运行。实际上,这是...

    java多线程设计模式

    - **未捕获异常终止线程**:线程抛出未捕获异常会立即终止,应妥善处理线程异常,避免程序崩溃。 通过对这些知识点的深入理解和实践,你可以编写出高效、稳定且可维护的多线程Java程序。记住,理解和掌握多线程...

    Java面试题线程部分.docx

    Java线程是编程中不可或缺的一部分,特别是在开发大型的、高并发的应用时。下面将详细讨论与Java线程相关的知识点。 1. **线程与进程**: - **线程**是程序的执行单元,它在进程的上下文中运行,一个进程中可以有...

    设计滚动字演示线程状态及改变方法

    - **多线程环境下,异常处理特别重要**,因为一个线程的异常可能会影响其他线程。确保每个线程都有适当的异常处理机制。 7. **线程池**: - **ExecutorService**:Java 5引入了`ExecutorService`,它可以管理和...

    java课件, 包含多线程

    4. **死亡状态(Terminated)**:线程执行完毕或被异常终止后的状态。 ### 控制线程的基本方法 1. **测试线程状态**:`isAlive()`方法用于检查线程是否仍然存活。 2. **线程优先级控制**:使用`getPriority()`和`...

    java多线程入门的源代码

    Java线程有五种状态:新建、就绪、运行、阻塞和死亡。通过`Thread.State`枚举可以获取线程当前状态。线程控制包括:`sleep()`使线程暂停指定时间,`join()`等待其他线程结束,`yield()`让当前线程暂停让其他线程有...

    Java企业系列面试题(线程篇).docx

    - Dead(死亡):线程执行完毕或被异常终止。 4. **`synchronized`关键字**: `synchronized`用于实现线程同步,防止数据竞争。它可以修饰方法或代码块。修饰方法是类级别的同步(粗粒度锁),整个方法的执行过程...

    java多线程核心编程技术

    - **死亡**:线程正常退出或异常终止后进入死亡状态。 #### 三、线程同步与互斥 ##### 3.1 synchronized关键字 `synchronized`关键字用于实现线程同步,它可以修饰方法或代码块: - **修饰实例方法**:作用于当前...

    java异常汇总.txt

    在Java编程中,异常处理是一种重要的机制,用于处理程序执行过程中可能出现的错误或异常情况。Java中的异常分为两大类:**受检异常**(Checked Exceptions)和**非受检异常**(Unchecked Exceptions)。受检异常是在...

Global site tag (gtag.js) - Google Analytics