我正在尝试使用 ThreadPoolExecutor 来安排任务,但在其策略上遇到了一些问题。这是其声明的行为:
- 如果运行的线程少于 corePoolSize,则 Executor 总是更喜欢添加新线程而不是排队。
- 如果 corePoolSize 或更多线程正在运行,Executor 总是更喜欢排队请求而不是添加新线程。
- 如果请求无法排队,则会创建一个新线程,除非这将超过 maximumPoolSize,在这种情况下,该任务将被拒绝。
我想要的行为是这样的:
- 和上面一样
- 如果超过 corePoolSize 但小于 maximumPoolSize 线程正在运行,则更喜欢添加新线程而不是排队,并且使用空闲线程而不是添加新线程。
- 和上面一样
基本上我不希望任何任务被拒绝;我希望他们在无界队列中排队。但我确实希望拥有最多 maximumPoolSize 线程。如果我使用无界队列,它在达到 coreSize 后永远不会生成线程。如果我使用有界队列,它会拒绝任务。有没有办法解决?
我现在正在考虑的是在 SynchronousQueue 上运行 ThreadPoolExecutor,但不直接将任务提供给它 - 而是将它们提供给单独的无界 LinkedBlockingQueue。然后另一个线程从 LinkedBlockingQueue 提供给 Executor,如果一个被拒绝,它会再次尝试,直到它没有被拒绝。不过,这似乎是一种痛苦和一种黑客行为 - 有没有更清洁的方法来做到这一点?