ScheduledThreadPoolExecutor and corePoolSize 0?

我希望有一个如果没有工作要做,它也会停止最后一个线程,如果有新任务,则创建(并保持线程活动一段时间)。但是,一旦没有更多的工作要做,它应该再次丢弃所有线程。ScheduledThreadPoolExecutor

我天真地创建了它,但结果是,没有创建任何线程,也没有执行任何计划任务。new ScheduledThreadPoolExecutor(0)

谁能告诉我,如果我能在不写自己的包装的情况下实现我的目标?ScheduledThreadpoolExecutor

提前致谢!


答案 1

实际上你可以做到,但它并不明显:

  • 创建新的 ScheduledThreadPoolExecutor
  • 在构造函数中,将核心线程设置为所需的最大线程数
  • 设置执行器的 keepAliveTime
  • 最后,允许核心线程超时

    m_Executor = new ScheduledThreadPoolExecutor ( 16,null );
    m_Executor.setKeepAliveTime ( 5, TimeUnit.SECONDS );
    m_Executor.allowCoreThreadTimeOut ( true );
    

    这仅适用于Java 6


答案 2

我怀疑中没有提供任何内容可以为您做到这一点,只是因为如果您需要计划的执行服务,那么您经常需要执行重复的任务。如果你有一个定期任务,那么通常更有意义的做法是保持相同的线程并将其用于任务的下一次重复,而不是拆除你的线程并在下一个重复周期时必须构建一个新线程。java.util.concurrent

当然,计划的执行程序可用于在非周期性任务之间插入延迟,或者它可以用于资源非常稀缺且重复周期非常少的情况,以至于在新的工作到达之前,断开所有线程是有意义的。所以,我可以看到你的建议肯定有意义的情况。

为了实现这一点,我会考虑尝试将缓存线程池与单线程调度执行器服务(即 )一起包装。可以通过计划的执行程序服务来计划任务,但计划的任务将以这样的方式包装,即单线程计划执行程序不会让您的单线程计划执行程序执行它们,而是将它们移交给缓存的线程池进行实际执行。Executors.newCachedThreadPoolnew ScheduledThreadPoolExecutor(1)

这种折衷方案将为您提供在绝对没有工作要做时最多运行一个线程,并且当有大量工作要做时,它会根据需要为您提供任意数量的线程(当然,在系统的限制范围内)。


推荐