ZPY博客

Java中线程池如何处理异常?

在Java中,线程池可以使用Thread.UncaughtExceptionHandler接口来处理未捕获的异常。当线程池中的线程抛出未捕获的异常时,将会触发线程池的UncaughtExceptionHandler。如果没有为线程池设置自定义的UncaughtExceptionHandler,则会使用默认的UncaughtExceptionHandler。

以下是设置线程池UncaughtExceptionHandler的示例代码:

public class MyThreadExceptionHandler implements Thread.UncaughtExceptionHandler {
    @Override
    public void uncaughtException(Thread t, Throwable e) {
        System.out.println("Thread " + t.getName() + " threw an exception: " + e.getMessage());
    }
}

public class ThreadPoolDemo {
    public static void main(String[] args) {
        ExecutorService executor = Executors.newFixedThreadPool(10);
        executor.execute(new MyTask());
        // 设置自定义的UncaughtExceptionHandler
        executor.execute(new MyTask());
        ((ThreadPoolExecutor) executor).setUncaughtExceptionHandler(new MyThreadExceptionHandler());
        executor.shutdown();
    }
}

public class MyTask implements Runnable {
    @Override
    public void run() {
        throw new RuntimeException("Exception in task");
    }
}

在上面的示例代码中,我们创建了一个名为MyThreadExceptionHandler的类来实现Thread.UncaughtExceptionHandler接口。在ThreadPoolDemo类中,我们首先创建了一个ExecutorService实例,然后使用execute()方法来执行两个任务。第一个任务会抛出异常,而第二个任务会在抛出异常时使用我们自定义的MyThreadExceptionHandler来处理异常。