线程池与异常

  • java
  • 线程池

一、处理线程池内的线程的异常

public static void main(String[] args) {
        ExecutorService executorService= Executors.newFixedThreadPool(1);
        // 1
        Future<?> future =  executorService.submit(new Task());
        // 2
        executorService.execute(new Task());
}
  1. 在runnable中使用try-catch去捕获所有异常,自己可以处理并打印异常;

  2. 如果在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...