zoukankan      html  css  js  c++  java
  • java UncaughtExceptionHandler 处理线程意外中止

    本文转自: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;// 抛出异常的地方
      }
     
    }
  • 相关阅读:
    解释机器学习模型的一些方法(一)——数据可视化
    机器学习模型解释工具-Lime
    Hive SQL 语法学习与实践
    LeetCode 198. 打家劫舍(House Robber)LeetCode 213. 打家劫舍 II(House Robber II)
    LeetCode 148. 排序链表(Sort List)
    LeetCode 18. 四数之和(4Sum)
    LeetCode 12. 整数转罗马数字(Integer to Roman)
    LeetCode 31. 下一个排列(Next Permutation)
    LeetCode 168. Excel表列名称(Excel Sheet Column Title)
    论FPGA建模,与面向对象编程的相似性
  • 原文地址:https://www.cnblogs.com/runwulingsheng/p/5208833.html
Copyright © 2011-2022 走看看