Thread.UncaughtExceptionHandler(为每一个Thread对象加一个异常处理器)

转载 2015年11月19日 14:57:22

原文地址:http://peirenlei.iteye.com/blog/305079
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接口。
這樣就夠了

uncaughtException(Thread a, Throwable e)可以拿到Thread,所以在uncaughtException释放相关资源是最好的办法。
总之,JDK5.0中Thread及其相关的辅助功能得到了加强,为我们提供了很多便利和安全的解决方案:)

import java.lang.Thread.UncaughtExceptionHandler;

public class ThreadTest {

public static void main(String[] args) {
ErrHandler handle = null;
ThreadA a = null;

a = new ThreadA();
handle = new ErrHandler();
a.setUncaughtExceptionHandler(handle);// 加入定义的ErrHandler
a.start();

}

}

/**
* 自定义的一个UncaughtExceptionHandler
*/
class ErrHandler implements UncaughtExceptionHandler {
/**
* 这里可以做任何针对异常的处理,比如记录日志等等
*/
public void uncaughtException(Thread a, Throwable e) {
System.out.println(“This is:” + a.getName() + “,Message:”
+ e.getMessage());
e.printStackTrace();
}
}

/**
* 拥有UncaughtExceptionHandler的线程
*/
class ThreadA extends Thread {

public ThreadA() {

}

public void run() {

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

}

}

一种基于Java的异常处理装置及其异常处理方法

摘要 本发明是一种基于Java的异常处理的装置及其异常处理方法,其中异常处理装置主要包括异常管理器、XML解析器、类反射器、异常处理器、异常处理结果信息封装器及日志记录器,并提供异常处理框架接口...
  • dongwenkai365506
  • dongwenkai365506
  • 2016年06月04日 13:38
  • 315

springmvc学习笔记(16)-异常处理器

本文主要介绍springmvc中异常处理的思路,并展示如何自定义异常处理类以及全局异常处理器的配置...
  • h3243212
  • h3243212
  • 2016年03月12日 12:02
  • 3497

springmvc异常处理-全局异常处理器开发

springmvc提供全局异常处理器进行统一异常处理(一个系统只有一个异常处理器)   自定义的异常类 对不同的异常类型定义异常类,异常类继承Exception...
  • u013310119
  • u013310119
  • 2016年06月27日 14:25
  • 2353

Java thread中对异常的处理策略

前言     想讨论这个话题有一段时间了。记得几年前的时候去面试,有人就问过我一个类似的问题。就是java thread中对于异常的处理情况。由于java thread本身牵涉到并发、锁等相关的...
  • dearfellow
  • dearfellow
  • 2016年09月20日 11:03
  • 569

Java线程未捕获异常处理

Java线程未捕获异常处理        线程执行完run方法即可正常退出,如果发生了没有捕获的异常则会异常退出。大多数情况下,由于异常导致的线程退出都不是我们想要的。所以在编写的代码的时候...
  • hongxingxiaonan
  • hongxingxiaonan
  • 2016年01月16日 13:14
  • 4486

Jersey全局异常处理器

全局异常处理器 webservice定义全局返回错误码,是很重要的一个功能,jersey正好就能实现这一功能. 整个流程就是当jersey托管的类发现了异常, 抛出给jersey的异常处理器,...
  • sotong006
  • sotong006
  • 2017年07月27日 19:18
  • 137

多核心处理器知识与最大加速比计算方法-多处理器编译

SMP(Symmetric Multi-Processing),对称多处理结构的简称,是指在一个计算机上汇集了一组处理器(多CPU),各CPU之间共享内存子系统以及总线结构。在这种技术的支持下,一个服...
  • yygydjkthh
  • yygydjkthh
  • 2014年03月10日 17:24
  • 2898

关于线程中异常的处理

我们经常使用try..catch进行异常处理,但是对于Uncaught Exception是没办法捕获的。对于这类异常如何处理呢? 回顾一下thread的run方法,有个特别之处,它不会抛出任何检...
  • likun557
  • likun557
  • 2016年11月16日 14:55
  • 1327

ARM的异常处理过程分析

原文地址:http://blog.chinaunix.net/uid-20937170-id-3220124.html 近来翻了uOS-II官网给出来的ARM7-ARM9移植手册(AN-104)...
  • xiaohuima_dong
  • xiaohuima_dong
  • 2015年05月14日 23:16
  • 1442

Cortex-M3内核的异常处理机制

转自:http://www.ednchina.com/ART_8800511894_29_35572_AN_b3004107.HTM?jumpto=view_welcomead_13699867430...
  • zhaojuncq
  • zhaojuncq
  • 2013年05月31日 16:44
  • 1241
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Thread.UncaughtExceptionHandler(为每一个Thread对象加一个异常处理器)
举报原因:
原因补充:

(最多只允许输入30个字)