开发者社区> 问答> 正文

当线程中发生异常时,SchduledExecutorService不执行UncaughtExcept

我正在使用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打印的

展开
收起
小六码奴 2019-10-10 17:56:03 869 0
1 条回答
写回答
取消 提交回答
  • 当线程由于未捕获的异常而即将终止时,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 作为参数。

    2019-10-10 17:57:26
    赞同 展开评论 打赏
问答分类:
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
多IO线程优化版 立即下载
低代码开发师(初级)实战教程 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载