线程异常

来源:互联网 发布:编程来回打括号好烦 编辑:程序博客网 时间:2024/05/17 02:49

线程代码不能抛出任何checked异常。,checked异常都只能被线程本身消化掉。checked异常一定要在线程内部消化。 但是,线程代码中是可以抛出错误(Error)和运行级别异常(RuntimeException)的。Erro通常是vm处理的,而RuntimeException确是比较正常的,如果在运行过程中满足了某种条件导致线程必须中断,可以选择使用抛出运行级别异常来处理。


当线程代码抛出运行级别异常之后,线程会中断。但是对于invoke此线程的主线程不受这个影响,不会处理这个RuntimeException,而且根本不能catch到这个异常。会继续执行自己的代码 。
所以:线程方法的异常只能自己来处理。


可以通过给某个thread设置一个UncaughtExceptionHandler,确保在该线程出现异常时能通过回调UncaughtExceptionHandler接口的uncaughtException方法来处理异常,这样的好处或者说目的是可以在线程代码边界之外(Thread的run()方法之外),有一个地方能处理未捕获异常。但是要特别明确的是:虽然是在回调方法中处理异常,但这个回调方法在执行时依然还在抛出异常的这个线程中

另外还要特别说明一点:如果线程是通过线程池创建,线程异常发生时UncaughtExceptionHandler接口不一定会立即回调。


一些情况下主线程的调用方可能只是想知道子线程执行过程中发生过哪些异常,而不一定会处理或是立即处理,那么发起子线程的方法可以把子线程抛出的异常实例收集起来作为一个Exception的List返回给调用方,由调用方来根据异常情况决定如何应对。不过要特别注意的是,此时子线程早以终结。

原创粉丝点击