我正在使用 ScheduledExecutorService,它使用 ThreadFactory 创建新线程。但是当定时任务发生异常时,threadfactory中的UncaughtExceptionHandler并没有被执行。为什么会这样?
线程工厂如下:
public class CustomThreadFactory {
public static ThreadFactory defaultFactory(String namePrefix) {
return new ThreadFactoryBuilder()
.setNameFormat(String.format("%s-%%d", namePrefix))
.setDaemon(false)
.setUncaughtExceptionHandler(new CustomExceptionHandler())
.build();
}
}
异常处理程序:
public class CustomExceptionHandler implements Thread.UncaughtExceptionHandler {
@Override
public void uncaughtException(Thread thread, Throwable t) {
log.error("Received uncaught exception {}", thread.getName(), t);
}
}
主要功能:
public static void main(String[] args) {
ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(
CustomThreadFactory.defaultFactory("scheduler"));
ThreadPoolExecutor executor = new ThreadPoolExecutor(1, 1, 20L,
TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>(1));
scheduler.scheduleWithFixedDelay(
() -> {
executor.submit(() -> Thread.sleep(10000));
},0,1,TimeUnit.SECONDS);
}
我正在陈述我的确切问题,以免它最终成为 XY 问题。在上面的代码片段中,阻塞队列的大小为 1,并且每秒都会将任务添加到阻塞队列中。因此,在添加第三个任务时,阻塞队列执行器给出RejectionExecutionException
的不是UncaughtExceptionHandler
.