在多线程中,如果线程的执行代码中出现异常,应该怎么处理?是抛出异常还是在执行代码中直接try catch了?我想一切的一切先从下面的这个demo说起。
public class TestThread {
public void testExecute() {
try {
ExecutorService executorService = Executors.newCachedThreadPool();
executorService.execute(new ExceptionDemo());
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
public static void main(String[] args) {
new TestThread().testExecute();
}
}
class ExceptionDemo implements Runnable {
@Override
public void run() {
int i = 1 / 0;
System.out.println(i);
}
}
先不执行,我们推断一下:多线程执行run方法时,会抛出runtime异常,在testExecute方法中,会将这个异常捕获到,然后做相应的处理。
现在我放到eclipse中,执行一次上面的代码,发现我想错了,异常并没有被捕捉到,而是直接抛出了,怎么回事?再仔细一想,也符合线程的设计初衷:
线程本身就是被看作独立的执行片断,每启动一个新的线程都会产生一个的线程栈,里面的任务在它新生成的线程栈里运行,跟你启动该线程的线程没有直接的关系。
回到一开始的话题,线程的执行代码其实都是放在run方法中的:
@Override
public void run()
这样肯定是不能抛出checked异常了,也就是说所有的checked异常都必须处理掉或者转化为运行时异常再抛出。
而上面的例子又发现,抛出的异常不能被主线程捕获,我们可以为线程创建一个处理异常类Thread.UncaughtExceptionHandler 来解决,如下:
static class UncaughtExceptionHandler implements Thread.UncaughtExceptionHandler{
@Override
public void uncaughtException(Thread t, Throwable e) {
throw new RuntimeException(e);
}
}