java - 消费者池的自动缩放

标签 java multithreading producer-consumer

我们有一个网络应用程序,可以让用户触发对外部资源的请求。外部资源花费不确定的时间来收集结果,因此我们必须对其进行轮询以获取更新,并在完成后收集最终结果。

我们希望这样当用户触发请求时,它会被添加到队列中,然后许多工作线程将接收每个请求并进行轮询,同时用户做其他事情。

由于一天中请求的数量变化很大,我们认为在缓慢时让很多工作人员无所事事会浪费资源,但同时我们需要有足够的工作人员来处理高峰期在系统上加载。

我们希望有一些东西可以在有很多请求等待时添加更多的 worker ,但在没有什么可做的时候杀死 worker 。

可以/曾经可以使用 EJB 来做到这一点,但我们不想使用它。我们也不想使用 JMS 或其他大型框架来处理这个问题,除非它是我们已经在使用的框架(Spring、Quartz、许多 Apache 的东西)。

由于 EJB 对此有支持,并且它是其中发现的更有用的功能之一,我们认为有人已经为我们解决了这个问题。有什么建议吗?

最佳答案

使用 ThreadPoolExecutor为核心和最大池大小设置适当的值。

请记住,拥有数百个空闲线程的成本并不高,因此您可以考虑只使用 Executors.newFixedThreadPool() .

关于java - 消费者池的自动缩放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1471495/

相关文章:

java - 在 Applet 中使用 Java Graphics 时如何使用 BasicStroke 方法?

java - 带有 Thread 类和 Runnable 接口(interface)的输出

logging - GCP 日志路由器接收器没有将日志路由到主题?

java - 具有消费者-生产者设计的 TCP 套接字服务器 'cpu time limit exceeded'

具有停止条件的 Java 生产者-消费者

Java Swing : How can I change the size of one row in a Grid layout and allow it to resize dynamically only horizontally and not vertically?

java - 这段代码中的indexOf 有什么问题?为什么当我尝试打印indexOfanswer1时得到-1?

java - 在 surefire 执行中的所有测试之前和之后运行代码

java - 同步方法和 block 的行为不同

c# - 访问Collection时出现A​​rgumentOutOfRangeException,即使索引未超出范围?