我正在尝试使用ThreadPoolExecutor来计划任务,但遇到了一些其策略问题。这是它的行为:ThreadPoolExecutor策略
- 如果少于corePoolSize线程正在运行,执行程序总是喜欢添加一个新的线程,而不是排队。
- 如果corePoolSize或更多的线程正在运行,执行程序总是优先排队请求而不是添加新线程。
- 如果请求无法排队,则会创建一个新线程,除非该值超过maximumPoolSize,在这种情况下,该任务将被拒绝。
我想要的行为是这样的:
- 同上
- 如果不是maximumPoolSize线程多于corePoolSize但不运行的,更喜欢加入了排队一个新的线程,并使用空闲线程通过添加一个新的线程。
- 同上
基本上我不希望有任何的任务被拒绝;我希望他们排在一个无限的队列中。但我确实需要达到maximumPoolSize线程。如果我使用无界队列,它在命中coreSize之后永远不会生成线程。如果我使用有界队列,它会拒绝任务。有没有办法解决?
我现在想的是在SynchronousQueue上运行ThreadPoolExecutor,但不是直接向它提供任务 - 而是将它们馈送给单独的无界LinkedBlockingQueue。然后另一个线程从LinkedBlockingQueue馈入Executor,如果有人被拒绝,它会再次尝试,直到它不被拒绝。这看起来像是一种痛苦和一点点黑客攻击 - 是否有更简单的方法来做到这一点?
哎呀,我写的并不完全是我想要的。我编辑了原文。 – 2010-08-05 21:48:28
设置corePoolsize = maximumPoolSize确实接近,但我也使用allowCoreThreadTimeOut(false)和prestartAllCoreThreads()。 – 2010-08-05 22:21:42