我正在使用ScheduledExecutorService,它使用ThreadFactory创建新线程。但是,如果计划任务中发生某些异常,则不会执行threadfactory中的UncaughtExceptionHandler。为什么会这样呢?
threadfactory如下:
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); } 在以上代码段中, blocking queue 的大小为1,并且每秒将任务添加到 blocking queue 。因此,在添加第三个任务时, blocking queue 执行器给出RejectionExecutionException它不是由UncaughtExceptionHandler打印的
当线程由于未捕获的异常而即将终止时,Java虚拟机将UncaughtExceptionHandler使用Thread.getUncaughtExceptionHandler()查询线程的线程,并调用处理程序的uncaughtException方法,并将线程和异常作为参数传递。
如果提交的任务抛出未捕获的异常但RejectionExecutionException 任务本身未抛出,则将调用UncaughtExceptionHandler 。但是,您可以传递RejectedExecutionHandler给ThreadPoolExecutor。
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
RejectedExecutionHandler handler) {
this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
Executors.defaultThreadFactory(), handler);
} ThreadPoolExecutor RejectedExecutionHandler 作为参数。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。