java - 多个请求的阻塞队列行为

标签 java multithreading servlets queue blockingqueue

如果我的问题很愚蠢,我很抱歉。

我正在使用ArrayBlockingQueue。

private ArrayBlockingQueue<RequestParameters> processorQueue;
private int sizeOfQueue = 3000;

在这里,我的生产者是单独的线程,消费者是单独的线程。 两者都在单生产者-消费者线程模型中运行。

现在,我正在运行我的 Java 应用程序,它向我的 Servlet 发出请求。生产者将请求放入队列中。 Consumer拍下请求并开始处理,其中涉及到DB操作。(大约需要1秒完成任务)

在这里,我的生产者非常快地获取请求,它填充队列并等待消费者开始处理并在队列中腾出空间。

我的问题是

  1. 我应该使用什么最好的 BlockingQueue Impl,这样我才能获得最佳性能。
  2. 当队列大小已满时会发生什么,我的意思是,无论 Producer 是否正在等待队列变空,Servlet 都会收到请求。所有这些传入的请求怎么样?这些请求会去哪里?那些请求是 存储在 JVM 内存中并在非阻塞后交给生产者线程?

谢谢。

最佳答案

尽管正确的解决方案取决于您的应用程序要求的可行性,但以下内容可能会有所帮助:

当 Q 已满而不是无限期地阻塞时,请使用 timeout 进行阻塞,以便 servlet 将在固定配置的时间内返回响应。如果发生超时,servlet 可以抛出服务器繁忙类型的自定义错误消息或相关的HTTP-CODE

由于您的消费者速度很慢而生产者非常快,您不妨考虑增加消费者线程,以减少 servlet 调用者的阻塞体验。

此外,接受所有请求(即存储到无界 Q 中)并不是一个好的解决方案,因为(取决于请求大小)由于消费者 Q 速度较慢,随着时间的推移可能会消耗大量内存。

关于java - 多个请求的阻塞队列行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17717620/

相关文章:

c++ - 多线程中的 OpenCV CascadeClassifier C++ 接口(interface)

java - Spring Batch 多线程 - 如何让每个线程读取唯一记录?

javax.el.PropertyNotFoundException : The class 'PureJavaClasses.employeeClass' does not have the property 'Id'

java - 如何从 html 对象标签内部编码/解码查询字符串?

java - 带除数的整数数组

java - 如何捕获 System.exit 事件?

java - 项目目标 (Android 5.0.1) 未正确加载

java - 使用 Java 写入文本文件,覆盖测试用例的输出

c# - 如何等到进程终止后再继续执行 - C#

java - 如何在 JSP 页面中使用在我的 servlet 中声明的变量?