首页 > 解决方案 > 具有固定大小线程池的 ExecutorService - 如何阻止添加任何更多任务,直到池大小有空间

问题描述

我当前的实现计算有多少任务添加到池中,并在完成任务时减少。

然后我告诉主代码重复+睡眠,直到活动任务低于线程池大小,然后再添加另一个任务。

我觉得必须有更好的方法?

我不希望将任务放在队列中,但我很乐意等待池告诉我它已准备好接收更多任务。

作为背景,我有一个我希望调用的 Web 服务,它涉及大约 150,000 个 HTTP 调用,我计划一次执行 50 个,直到完成全部 150,000 个调用,这就是为什么我不能将所有任务排队为我会耗尽我的内存。

我不希望任何阻塞超时 - 只要线程池有空间用于新任务,我很乐意等待。

关于如何实现这一点的任何建议?

标签: javamultithreadingthreadpoolexecutorserviceblockingqueue

解决方案


处理这个问题的一种方法是启动你自己的消费者线程,这些线程与你自己的运行相反BlockingQueue,完全避免使用ExecutorService。即声明一个ArrayBlockingQueue容量为 50 的生产者线程向其提供/放置元素(当队列已满时将阻塞),消费者线程从中拉出并做必要的工作。

或者,有一个实现ThreadPoolExecutor可以通过添加自定义RejectedTaskHandler来为调用添加阻塞行为来满足您的需求execute。请参阅github 上的 NotifyingBlockingThreadPoolExecutor。我不能保证它的质量,但它应该完全符合您的需要。


推荐阅读