ScheduledThreadPoolExecutor不能指定maximumPoolSize,这是因为其内部实现机制决定的。ScheduledThreadPoolExecutor的构造函数中,maximumPoolSize参数被硬编码为Integer.MAX_VALUE,这意味着无论我们如何设置maximumPoolSize参数,其实际最大线程数始终是Integer.MAX_VALUE,即理论上的最大整数值。这种设计选择背后的原因主要是为了确保延迟任务能够及时被处理,避免因为线程池大小限制而导致任务处理延迟。
ScheduledThreadPoolExecutor使用的是DelayedWorkQueue队列,这是一个无界队列,意味着其可以容纳无限多的任务。由于这个队列是无界的,因此设置maximumPoolSize实际上是没有意义的,因为队列本身不会成为限制因素。corePoolSize参数指定了线程池中的线程数量,而keepAliveTime参数定义了当线程池中的线程数量超过corePoolSize时,多余的空闲线程的存活时间。然而,由于maximumPoolSize被设置为一个极大的值,实际上线程池的大小主要受控于corePoolSize的设置,以及任务队列的处理能力。
此外,由于ScheduledThreadPoolExecutor主要负责调度延迟执行的任务,它并不直接处理业务逻辑。这意味着,即使设置了较大的corePoolSize,在实际应用中,如果并发任务较少,也可能会造成线程的浪费。因此,一种常见的做法是将ScheduledThreadPoolExecutor作为任务调度器,将具体的业务逻辑处理交给其他标准的线程池来执行,以避免资源的浪费