【发布时间】:2015-07-08 17:15:58
【问题描述】:
是否有ExecutorService 实现,其行为类似于具有以下特征的线程池?
- 始终至少有 X 个活动线程。
- 如果提交任务并且所有活动线程都忙,则会启动一个新线程,最多 Y 个线程。
- 如果提交了任务并且所有 Y 线程都忙,则该任务将排队。
- 如果没有提交新任务,池将缩减为 X 个活动线程。
相当标准的线程池行为。你会认为ThreadPoolExecutor 会处理这个问题,但是
executorService = new ThreadPoolExecutor(
2, 10, // min/max threads
60, TimeUnit.SECONDS, // time of inactivity before scaling back
new SynchronousQueue<Runnable>()); // task queue
如果提交的任务超过 10 个,将抛出异常。切换到LinkedBlockingQueue 将永远不会超过两个最小线程,除非您像new LinkedBlockingQueue<Runnable>(20) 这样限制大小,在这种情况下,将有两个线程处理 1-20 个任务,2-10 个线程处理 21-30 个任务,超过 30 个任务的例外。不漂亮。同时,固定线程池永远不会缩减非活动线程。
那么,为了得到我想要的东西,我可以使用不同类型的BlockingQueue 或摆弄我错过的其他设置吗?是否有另一个更适合的ExceutorService 实现(哪个?),或者我最好通过覆盖ThreadPoolExecutor 的execute() 方法来滚动自己的实现?
【问题讨论】:
-
我不认为一些不活跃的线程会造成太大的伤害?
-
我也不明白您对非活动线程的担忧。 Afaik,他们坐在那里休息,几乎没有任何间接费用。
标签: java multithreading executorservice