`
kavy
  • 浏览: 888328 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

JDK5Thread的run失常的setUncaughtExceptionHandler处理

 
阅读更多

JDK5_Thread的run异常的setUncaughtExceptionHandler处理

Thread的run方法是不抛出任何检查型异常(checked exception)的,但是它自身却可能因为一个异常而被终止,导致这个线程的终结。最麻烦的是,在线程中抛出的异常即使使用try...catch也无法截获,因此可能导致一些问题出现,比如异常的时候无法回收一些系统资源,或者没有关闭当前的连接等等。 

JDK5.0之前,不能为单独的Thread设置UncaughtExceptionHandler,也不能指定一个默认的UncaughtExceptionHandler。为了可以设置一个UncaughtExceptionHandler,需要去继承ThreadGroup并覆写uncaughtException方法。 

在JDK5.0中,我们通过Thread的实例方法setUncaughtExceptionHandler,可以为任何一个Thread设置一个UncaughtExceptionHandler。当然你也可以为所有Thread设置一个默认的UncaughtExceptionHandler,通过调用Thread.setDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh)方法,这是Thread的一个static方法。 

定义一个Handler类必须实现Thread.UncaughtExceptionHandler接口的void uncaughtException(Thread t, Throwable e)方法。如果不设置一个Handler,那么单个Thread的Handler是null。但是,如果这个单个线程是ThreadGroup中的一个Thread,那么这个线程将使用ThreadGroup的UncaughtExceptionHandler。ThreadGroup自身已经实现了Thread.UncaughtExceptionHandler接口。

 

package com.gw.test.thread;

 

import java.lang.Thread.UncaughtExceptionHandler;

 

public class ThreadTest {

 

    public static void main(String[] args) {

        ErrHandler handle = null;

        ThreadA a = null;

        try {

            a = new ThreadA();

            a.start();

            handle = new ErrHandler();

            a.setUncaughtExceptionHandler(handle);

            // 加入定义hr.hrfunder.com的ErrHandlera.start();

        } catch (Exception e) {

            handle.uncaughtException(a, e);// 捉拿到了!!!

        }// 等闲线程即方便用try...catch也无法捉拿到抛出的失常//

        try {

            //

            ThreadB b = new ThreadB();//

            b.start();//

        } catch (Exception e) {

            e.getMessage();// 不起作用//

        }

    }

}

 

class ErrHandler implements UncaughtExceptionHandler {

    public void uncaughtException(Thread a, Throwable e) {

        System.out.println("This is:" + a.getName() + ",Message:" + e.getMessage());

        e.printStackTrace();

    }

}

 

class ThreadA extends Thread {

    private Thread.UncaughtExceptionHandler handler;

 

    public ThreadA() {

    }

 

    public void run() {

        double i = 12 / 0;// 抛出失常的地方

    }

 

    public void setUncaughtExceptionHandler(Thread.UncaughtExceptionHandler handler) {

        this.handler = handler;

    }

 

    public Thread.UncaughtExceptionHandler getUncaughtExceptionHandler() {

        callback();

        return handler;

    }

 

    private void callback() {

        System.out.println("Callback Resources.");

    }

}

 

class ThreadB extends Thread {

    public ThreadB() {

    }

 

    public void run() {

        double i = 12 / 0;// 抛出失常的地方}

    }

}

 

分享到:
评论

相关推荐

    JDK5中的多线程并发库.doc

    在JDK5中,Java引入了一套强大的多线程并发库,极大地提升了多线程编程的效率和安全性。这个库提供了丰富的类和接口,使得开发者能够更好地控制线程的执行、同步和通信。 1. **线程** - **线程与进程的关系**:...

    JDK8新特性(pdf版)

    新时间日期API是JDK8的新特性之一,提供了对日期和时间的操作和处理。例如: public static void main(String[] args) { LocalDate date = LocalDate.now(); System.out.println("当前日期:" + date); } JDK8新...

    JDK5中的多线程并发库

    在JDK5中,多线程并发库引入了一系列新的特性,极大地增强了Java处理并发问题的能力。以下是关于这个主题的详细解释: 1. **线程**: - **线程与进程的关系**:进程是一个正在执行的程序实体,而线程是进程内部的...

    jdk1.8_win32.rar

    - JDK 1.8 includes the Nashorn JavaScript engine, allowing developers to run JavaScript code directly within a Java application. This feature promotes interoperability between Java and JavaScript, ...

    jdk使用164个实例

    5. **`Thread`类**:用于实现多线程,通过`start()`方法启动一个新线程,执行`run()`方法中的代码。 6. **`Exception`类**:异常处理是Java编程的重要部分,所有异常类都是`Exception`的子类,用于捕获和处理运行时...

    Java 的线程工厂 ThreadFactory原理及源码详解

    在JDK的源码使用工厂模式,ThreadFactory就是其中一种。 在我们一般的使用中,创建一个线程,通常有两种方式: 继承Thread类,覆盖run方法,实现我们需要的业务 继承Runnable接口,实现run方法,实现我们需要的业务,...

    jdk帮助文档中文版java

    开发者可以通过创建`Thread`对象并重写其`run()`方法来实现并发执行的逻辑。文档还会详细介绍如何启动线程、控制线程状态以及同步线程间操作。 总之,"jdk帮助文档中文版java"是Java开发者不可或缺的参考资料,无论...

    jdk1.8 Lambda表达式

    Lambda 表达式可以非常方便地实现线程处理,例如创建线程实例时,可以不用显式继承 Thread 类或实现 Runnable 接口,而是直接传递一个 Lambda 表达式来实现 run 方法的逻辑。这种方式简化了多线程编程的复杂性。 ...

    JDK_API_1_6

    JDK 1.6增强了注解处理功能,支持在编译时通过注解处理器生成源代码或资源文件。这一特性使得开发者可以利用注解来自动完成一些繁琐的任务,比如生成序列化代码、验证约束等。 ##### 2.5 文件系统API改进 为了更好...

    Java Thread中start()和run()的区别_动力节点Java学院整理

    在Java多线程编程中,理解`Thread`类的`start()`和`run()`方法的区别至关重要。这两个方法在实现线程并发执行时起到不同的作用。 首先,`start()`方法是用于启动一个新的线程。当你调用`start()`方法时,Java虚拟机...

    java学习笔记JDK6课件之十五

    Java线程是多任务编程的核心概念,特别是在JDK 6中,线程的使用对于理解和开发高效的并发应用程序至关重要。本章主要介绍了Java中创建和管理线程的两种主要方式:继承`java.lang.Thread`类和实现`java.lang.Runnable...

    JDK帮助文档

    - **Thread类**: 创建和控制线程,使用start()启动,run()执行线程任务。 - **同步机制**: 为了避免线程间的冲突,有synchronized关键字、wait()、notify()和notifyAll()方法。 10. **反射(Reflection)** - ...

    最新收集JDK1.5.0命令大全.txt

    ### JDK 1.5.0 命令大全解析 #### 1. `java.exe` - **概述**:`java.exe` 是 Java 运行时环境的核心组件之一,用于执行 `.class` 文件(即编译后的 Java 字节码)。 - **用法**: - `java [选项] 类名`:启动一个...

    day22_JDK8新特性.pdf

    Stream API是JDK8中的另一个核心特性,它允许对集合进行声明式处理,类似于SQL查询。Stream API可以方便地进行过滤、映射、聚合等操作,非常适合大规模数据处理和并行计算。例如,我们可以使用Stream API来找出一个...

    JDK命令大全新手的宝典

    ### JDK命令大全解析 #### 一、java.exe **功能:** 运行Java程序。 **说明:** `java.exe` 是Java开发工具包(JDK)的一部分,用于解释执行编译后的Java字节码(`.class` 文件)。它是Java编程语言的核心组成部分之...

    Java JDK1.5 生产消费者模式解决方案

    在Java编程语言中,生产者消费者模式是一种经典的多线程设计模式,用于处理并发问题。在JDK 1.5及以后的版本中,Java引入了`java.util.concurrent`包,其中包含了一些强大的并发工具类,如`Lock`接口和`Condition`...

    Multi person chat_jdk1.8_java编程_

    1. **继承Thread类**:创建一个新的类,该类继承自Thread类,并重写其run()方法。然后创建该类的实例并调用start()方法启动线程。这种方法简单直接,但因为Java不支持多重继承,所以如果类已经继承了其他类,则无法...

    java jdk安装向导

    - 右键选择`Run As` -> `Run on Server`。 - 选择之前配置好的服务器,例如`Tomcat v5.0 Server@localhost`,并点击`Next`。 - 在下一步中确认项目信息无误后,点击`Finish`完成部署。 **4. 控制服务器动作** - 在...

    jdk 1.6 英文api chm

    根据提供的文件信息,“jdk 1.6 英文api chm”这个标题及描述主要涉及的是Java Development Kit(JDK)版本1.6的英文API文档。这些文档通常以CHM(Compiled Help Manual)格式提供,是一种压缩的帮助文件格式,主要...

Global site tag (gtag.js) - Google Analytics