java多线程中的异常处理

Java多线程程序中,全部线程都不容许抛出未捕获的checked exception,也就是说各个线程须要本身把本身的checked exception处理掉。这一点是经过java.lang.Runnable.run()方法声明(由于此方法声明上没有throw exception部分)进行了约束。可是线程依然有可能抛出unchecked exception,当此类异常跑抛出时,线程就会终结,而对于主线程和其余线程彻底不受影响,且彻底感知不到某个线程抛出的异常(也是说彻底没法catch到这个异常)。JVM的这种设计源自于这样一种理念:“线程是独立执行的代码片段,线程的问题应该由线程本身来解决,而不要委托到外部。”基于这样的设计理念,在Java中,线程方法的异常(不管是checked仍是unchecked exception),都应该在线程代码边界以内(run方法内)进行try catch并处理掉.java

 

但若是线程确实没有本身try catch某个unchecked exception,而咱们又想在线程代码边界以外(run方法以外)来捕获和处理这个异常的话,java为咱们提供了一种线程内发生异常时可以在线程代码边界以外处理异常的回调机制,即Thread对象提供的setUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh)方法。编程

经过该方法给某个thread设置一个UncaughtExceptionHandler,能够确保在该线程出现异常时能经过回调UncaughtExceptionHandler接口的public void uncaughtException(Thread t, Throwable e) 方法来处理异常,这样的好处或者说目的是能够在线程代码边界以外(Thread的run()方法以外),有一个地方能处理未捕获异常。可是要特别明确的是:虽然是在回调方法中处理异常,但这个回调方法在执行时依然还在抛出异常的这个线程中!另外还要特别说明一点:若是线程是经过线程池建立,线程异常发生时UncaughtExceptionHandler接口不必定会当即回调。多线程

 

比之上述方法,还有一种编程上的处理方式能够借鉴,即,有时候主线程的调用方可能只是想知道子线程执行过程当中发生过哪些异常,而不必定会处理或是当即处理,那么发起子线程的方法能够把子线程抛出的异常实例收集起来做为一个Exception的List返回给调用方,由调用方来根据异常状况决定如何应对。不过要特别注意的是,此时子线程早以终结。.net

相关文章
相关标签/搜索