线程池与异常
一、处理线程池内的线程的异常
public static void main(String[] args) {
ExecutorService executorService= Executors.newFixedThreadPool(1);
// 1
Future<?> future = executorService.submit(new Task());
// 2
executorService.execute(new Task());
}
在runnable中使用try-catch去捕获所有异常,自己可以处理并打印异常;
如果在runnable中不使用try-catch去捕获异常,那么submit方法会吞掉异常,execute会抛出异常:
- execute的异常会在子线程中抛出;
- 而submit的话,当调用其返回的future的get方法时,会在main线程抛出异常的,不调用就不会抛出。
如何处理第二种情况?
在创建线程池的时候,自定义线程工厂,为创建的线程设置未捕获异常处理器,代码如下:
ThreadFactory factory = (Runnable runnable) -> {
var t = new Thread(runnable);
t.setDefaultUncaughtExceptionHandler((Thread thread, Throwable err) -> {
// ...
});
return t;
};
这样一来,当执行execute、future.get()时,如果发生异常,那么异常就会交由ExceptionHandler去处理。
二、有异常的线程会怎么样
会终止掉
终止掉的线程无法再被复用,所以还是要尽可能的去处理异常
Loading...