如何为ScheduledExecutorService指定自定义最大线程数
解决方法
你可以直接手动实例化ScheduledThreadPoolExecutor,调用它的全参数构造方法传入你要的最大线程数即可,示例代码如下:
import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; public ScheduledExecutorService scheduledExecutorService() { // 参数依次为:核心线程数、最大线程数、空闲线程存活时间、时间单位、线程工厂、拒绝策略 return new ScheduledThreadPoolExecutor( 3, 10, // 你自定义的最大线程数 60L, TimeUnit.SECONDS, Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy() ); }
注意事项
ScheduledThreadPoolExecutor的JavaDoc中已经明确说明:尽管该类继承自ThreadPoolExecutor,但部分继承的调优参数对它无效。因为它使用无界的DelayedWorkQueue作为任务队列,当核心线程都处于忙碌状态时,新提交的定时任务会直接放入队列等待,永远不会触发非核心线程的创建逻辑,因此你设置的maximumPoolSize参数实际上不会生效。
如果你的需求是控制定时任务的最大并发数,直接调整构造参数里的核心线程数到目标值即可,这个参数就是实际生效的最大并发数。
内容的提问来源于stack exchange,提问作者Swapnil
相关产品推荐
相关产品推荐

