ThreadPoolExecutor 策略
我正在尝试使用ThreadPoolExecutor来计划任务,但其策略遇到了一些问题。以下是其声明的行为:
- 如果运行的线程少于 corePoolSize 线程,则执行程序始终倾向于添加新线程而不是排队。
- 如果 corePoolSize 或更多线程正在运行,则执行程序始终倾向于对请求进行排队,而不是添加新线程。
- 如果请求无法排队,则会创建一个新线程,除非该线程超过 maxPoolSize,在这种情况下,任务将被拒绝。
我想要的行为是这样的:
- 同上
- 如果运行的池大小大于 corePoolSize 但小于最大值,则首选添加新线程而不是排队,并使用空闲线程而不是添加新线程。
- 同上
基本上,我不希望任何任务被拒绝;我希望它们在无限队列中排队。但我确实希望拥有最大PoolSize线程。如果我使用无界队列,它永远不会在达到coreSize后生成线程。如果我使用有界队列,它会拒绝任务。有什么办法可以解决这个问题吗?
我现在考虑的是在同步队列上运行 ThreadPoolExecutor,但不将任务直接提供给它 - 而是将它们提供给单独的无界 LinkedBlockingQueue。然后另一个线程从LinkedBlockingQueue馈送到执行器中,如果一个被拒绝,它只是重试,直到它不被拒绝。不过,这似乎是一种痛苦和一种黑客攻击 - 有没有一种更干净的方法可以做到这一点?