美文网首页我爱编程
Java如何捕获线程异常

Java如何捕获线程异常

作者: 小陈阿飞 | 来源:发表于2018-05-28 11:20 被阅读85次

    首先,我们要知道,在Java中,线程中的异常是不能抛出到调用该线程的外部方法中捕获的。

    为什么不能抛出到外部线程捕获?

    因为线程是独立执行的代码片断,线程的问题应该由线程自己来解决,而不要委托到外部。”基于这样的设计理念,在Java中,

    线程方法的异常都应该在线程代码边界之内(run方法内)进行try catch并处理掉.换句话说,我们不能捕获从线程中逃逸的异常。

    怎么进行的限制?

    通过java.lang.Runnable.run()方法声明(因为此方法声明上没有throw exception部分)进行了约束。

    如果在线程中抛出了线程会怎么样?

    线程会立即终结。

    现在我们可以怎样捕获线程中的异常?

    JDK5之后有了一个Thread.UncaughtExceptionHandler 新接口,它允许我们在每一个Thread对象上添加一个异常处理器。Thread.UncaughtExceptionHandler.uncaughtException()方法会在线程因未捕获的异常而面临死亡时被调用。

    我们该怎么使用啊??

    首先我们要先定义这个线程异常捕获的处理器

    1. public class MyUnchecckedExceptionhandler implements UncaughtExceptionHandler {  
    2.    @Override  
    3.    public void uncaughtException(Thread t, Throwable e) {  
    4.      System.out.println("捕获异常处理方法:" + e);  
    5.    }  
    6.  }
    

    我们有三种方式使用该线程异常捕获器:

    1、在创建线程的时候进行设置

    1.  Thread t = new Thread(new ExceptionThread());  
    2.  t.setUncaughtExceptionHandler(new MyUnchecckedExceptionhandler());  
    3.  t.start();  
    

    2、使用Executors创建线程时,还可以在TreadFactory中设置

    1.  ExecutorService exec = Executors.newCachedThreadPool(new ThreadFactory(){  
    2.  @Override  
    3.  public Thread newThread(Runnable r) {  
    4.  Thread thread = newThread(r);  
    5.  thread.setUncaughtExceptionHandler(new MyUnchecckedExceptionhandler());  
    6.  return thread;  
    7.  }  
    8.  });  
    9.  exec.execute(new ExceptionThread());  
    

    3、如果我们只需要一个线程异常处理器处理线程的异常,那么我们可以设置一个默认的线程异常捕获器,当线程出现异常时,

      如果我们没有指定线程的异常捕获器,而且线程组也没有设置(线程组不用考虑,因为这是一个不成功的尝试),那么就会使用
    

    默认的线程异常捕获器。

    1.  // 设置默认的线程异常捕获处理器  
    2.  Thread.setDefaultUncaughtExceptionHandler(new MyUnchecckedExceptionhandler());  
    

    通过以上方法就可以捕获并处理线程的异常了。

    转:https://blog.csdn.net/qq_30698633/article/details/77046829

    相关文章

      网友评论

        本文标题:Java如何捕获线程异常

        本文链接:https://www.haomeiwen.com/subject/tcgwjftx.html