Java 线程内异常处理

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;// 抛出异常的地方
  }
 
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏皮皮之路

【JDK1.8】JUC——LockSupport

35817
来自专栏Java编程技术

并发队列-无界阻塞延迟队列DelayQueue原理探究

DelayQueue队列中每个元素都有个过期时间,并且队列是个优先级队列,当从队列获取元素时候,只有过期元素才会出队列。

842
来自专栏会跳舞的机器人

java并发编程的艺术笔记第五章——java中的锁

锁是用来控制多个线程访问共享资源的方式,一般来说锁能够防止多个线程同时访问共享资源(有的锁可以允许多个线程访问共享资源,比如说读写锁),在Lock接口出现之前,...

491
来自专栏Jack-Cui

232.Implement Queue using Stacks(Stack-Easy)

Implement the following operations of a queue using stacks. push(x) – Push eleme...

2025
来自专栏IT技术精选文摘

CyclicBarrier、CountDownLatch以及Semaphore使用及其原理分析

CyclicBarrier、CountDownLatch以及Semaphore是Java并发包中几个常用的并发组件,这几个组件特点是功能相识很容易混淆。首先我们...

712
来自专栏mathor

线程的基本概念

944
来自专栏java初学

18.1 线程

2735
来自专栏无题

JDK中Concurrent包工具类指南

这篇翻译指南很能解决问题,对于初步建立并发包的认识很有帮助,感谢原作者和翻译者 Java 并发工具包 java.util.concurrent 用户指南 ...

5486
来自专栏皮皮之路

【JDK1.8】JUC——LockSupport

692
来自专栏Java 源码分析

NioEventLoopGroup 源码分析

NioEventLoopGroup 源码分析 1. 在阅读源码时做了一定的注释,并且做了一些测试分析源码内的执行流程,由于博客篇幅有限。为了方便 IDE 查看...

3266

扫码关注云+社区