线程池中的工作线程出现异常如何处理
预备知识
线程的生命周期、异常的传播方式以及如何优雅地终止一个线程。
在Java中,线程池的工作线程出现异常的时候,默认会把异常往外抛。同时这个工作线程会因为异常而销毁。我们需要自己取处理对应的异常。
异常处理的方法
在传递任务中去处理异常
对于每个提交到线程池中的执行的任务,可以提前通过异常进行捕获。这样即便出现异常,也不会影响线程池中的工作线程。
使用Future来获取异常结果
在线程池中提供了一个submit(Callable<T>)
方法,这个方法会返回一个Future。
我们可以通过调用Future.get()方法来获取任务的执行结果。
如果任务执行过程中抛出异常,也会抛出一个ExecutionException。其中包含了任务执行过程中的实际异常。
自定义一个ThreadFactory
设置一个叫UncaughtExceptionHandler,我们可以通过实现ThreadFactory的接口来自定义创建线程的方式。然后为每个新创建的线程设置一个UncaughtExceptionHandler。这个处理器会在线程由于未捕获异常而即将终止的时候被调用。