在JDK线程池中自带的Executor遵循一种典型的生产者,消费者队列模型,即一个统一的阻塞队列,然后一个线程数组不停地消费其中的数据。其本身的处理逻辑为 coreSize->queueSize->maxSize 的增长方式,即先尝试增加 coreSize, 然后再不断地将任务放进队列中,如果队列满了,则再尝试增加 maxSize, 直至拒绝任务。
通过一些手法可以调整策略为 coreSize->maxSize->queueSize。
本文则描述一个由 jboss-threads 中提到的 EnhancedQueueExecutor,中文为增加型队列执行器。其除支持典型的executor模型外,也同样保留如 coreSize,maxSize, queueSize 这些模型。与jdk中实现相区别的是,其本身采用单个链表来完成任务的提交和线程的执行,同时采用额外的数据来存储计数类数据. 更重要的是,其默认线程策略即 coreSize->maxSize->queueSize, 同时可以根据参数调整此策略.
创建对象与ThreadPoolExecutor类似,指定相应的参数即可,如下所示:
EnhancedQueueExecutor executor = new EnhancedQueueExecutor.Builder() .setCorePoolSize(corePoolSize) .setMaximumPoolSize(maxPoolSize) .setKeepAliveTime(Duration.ofMinutes(5)) .setMaximumQueueSize(1024) .setThreadFactory(threadFactory) .setExceptionHandler(uncaughtExceptionHandler) .setRegisterMBean(false) .setGrowthResistance(growthResistance) //增长因子,控制新线程创建逻辑(if >= coreSize时) .build();继续阅读“Jboss EnhancedQueueExecutor源码解读”