【问题标题】:ExecutorService with a fixed sized thread pool - how to block any more tasks being added until the pool size has space [duplicate]具有固定大小的线程池的 ExecutorService - 如何阻止添加任何更多任务,直到池大小有空间 [重复]
【发布时间】:2019-11-08 21:06:32
【问题描述】:

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

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

我觉得一定有更好的方法?

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

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

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

关于如何实现这一点有什么建议吗?

【问题讨论】:

    标签: java multithreading threadpool executorservice blockingqueue


    【解决方案1】:

    解决此问题的一种方法是启动您自己的消费者线程,这些线程针对您自己的BlockingQueue 运行,完全避免使用ExecutorService。 IE。声明一个容量为 50 的 ArrayBlockingQueue 并有一个生产者线程向其提供/放置元素(当队列满时将阻塞),消费者线程从中提取并执行必要的工作。

    另外,还有一个ThreadPoolExecutor 的实现,它通过添加自定义RejectedTaskHandler 来向execute 调用添加阻塞行为来满足您的需求。见NotifyingBlockingThreadPoolExecutor on github。我不能保证它的质量,但它应该能满足你的需要。

    【讨论】:

    • 谢谢 Trevor - 我将在周末尝试那个 GitHub 项目,我注意到有一个未解决的问题,任何其他计划使用它的人都应该记住 - 无论如何解决方案都在问题本身.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-10
    • 1970-01-01
    • 2021-10-03
    • 2019-10-24
    • 1970-01-01
    • 2016-09-01
    • 2016-04-08
    相关资源
    最近更新 更多