我尝试使用ThreadPoolExecutor来调度任务,但在其策略方面遇到了一些问题。以下是它的声明行为:
- 如果运行的线程少于corePoolSize,则执行程序始终倾向于添加新线程而不是排队。
- 如果有corePoolSize或更多的线程正在运行,则执行程序始终倾向于将请求排队而不是添加新线程。
- 如果无法将请求排队,则会创建一个新线程,除非这将超过maximumPoolSize,在这种情况下,任务将被拒绝。
我想要的行为是:
- 同上
- 如果运行的线程数在corePoolSize和maximumPoolSize之间,则优先添加新线程而不是排队,并且优先使用空闲线程而不是添加新线程。
- 同上
基本上,我不希望有任何任务被拒绝,我希望它们在一个无限制的队列中排队。但是我确实希望最多有maximumPoolSize个线程。如果我使用无界队列,当它达到coreSize时,它永远不会生成线程。如果我使用有界队列,则会拒绝任务。有没有什么解决方法?
现在我考虑的是在SynchronousQueue上运行ThreadPoolExecutor,但不直接向它提供任务-而是将它们提供给一个单独的无限制LinkedBlockingQueue。然后另一个线程从LinkedBlockingQueue中提取并将其提供给执行程序,如果被拒绝,则简单地重试,直到未被拒绝。虽然这似乎有点麻烦和有些hack,但是否有更清洁的方法?