要看我们有没有捕获处理这个异常,如果捕获处理了这个异常,那么线程会继续执行;如果没有对这个运行时异常进行捕获处理,那么有以下情况:
1、如果这个线程是主线程,那么它会释放掉所持有的锁,并且退出执行,主线程退出了,那么程序也就停止执行了;
2、如果这个线程不是主线程,那么它会释放掉所持有的锁,并且退出执行,但是它的退出不会导致程序停止执行,主线程和其他线程依然会继续执行。
java中的异常包括运行时异常和非运行时异常【也就是检查时异常】,编译器在编译的时候会去检查非运行时异常是否进行了处理,但是不会去检查运行时异常,所以我们必须处理检查时异常,却可以不去处理运行时异常。当然对于运行时异常也可以进行处理,只不过对于非主线程异常的处理方式与主线程有所不同:
主线程的异常处理器是由jvm自动调用的,我们无需去为主线程设置异常处理器,而在多线程编程中,我们需要为这些线程设置异常处理器,在Thread类中有一个内部接口UnCaughtExceptionHandler以及一个方法setUnCaughtExceptionHandler,我们需要定义一个类去实现这个内部接口UnCaughtExceptionHandler,然后调用这个方法去给线程设置异常处理器;或者是使用Executor框架为线程池设置异常处理器,ThreadPoolExecutor也有一个
setUnCaughtExceptionHandler方法,可以为线程池中的线程设置异常处理器。当为线程设置了异常处理器之后,线程在运行期间再发生异常,jvm就会去调用我们设置的异常处理器进行处理。