java - 具有固定大小线程池的 ExecutorService - 如何阻止添加任何更多任务,直到池大小有空间
问题描述
我当前的实现计算有多少任务添加到池中,并在完成任务时减少。
然后我告诉主代码重复+睡眠,直到活动任务低于线程池大小,然后再添加另一个任务。
我觉得必须有更好的方法?
我不希望将任务放在队列中,但我很乐意等待池告诉我它已准备好接收更多任务。
作为背景,我有一个我希望调用的 Web 服务,它涉及大约 150,000 个 HTTP 调用,我计划一次执行 50 个,直到完成全部 150,000 个调用,这就是为什么我不能将所有任务排队为我会耗尽我的内存。
我不希望任何阻塞超时 - 只要线程池有空间用于新任务,我很乐意等待。
关于如何实现这一点的任何建议?
解决方案
处理这个问题的一种方法是启动你自己的消费者线程,这些线程与你自己的运行相反BlockingQueue
,完全避免使用ExecutorService
。即声明一个ArrayBlockingQueue
容量为 50 的生产者线程向其提供/放置元素(当队列已满时将阻塞),消费者线程从中拉出并做必要的工作。
或者,有一个实现ThreadPoolExecutor
可以通过添加自定义RejectedTaskHandler
来为调用添加阻塞行为来满足您的需求execute
。请参阅github 上的 NotifyingBlockingThreadPoolExecutor。我不能保证它的质量,但它应该完全符合您的需要。
推荐阅读
- html - 外部 css(如何将图像与文章水平对齐)
- node.js - 数组内的 Firestore serverTimeStamp
- python - 不了解此 TypeError 异常的原因
- python - 范围对象的比较
- java - 以编程方式在 TestNG xml 套件中设置测试参数以进行并行执行
- c# - 如何截断十进制值然后在 Linq.Expressions c# 中进行比较
- python - 如何在 python 中用颜色显示、更新和旋转 3d 点?
- javascript - javascript中的fetch()不是从JSON制作表格
- sql - PL/SQL:使用游标的主从循环
- ruby-on-rails - Rails 管理员导入失败,属于关系