对不起,如果我的问题很傻。

我正在使用ArrayBlockingQueue。

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


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

现在,我正在运行我的Java App,它向我的Servlet发出请求。生产者将请求放入队列。
使用者对请求进行拍照并开始处理,其中涉及数据库操作。(大约需要1秒才能完成任务)

在这里,“我的生产者”正在非常迅速地收到请求,它填充了Queue,并等待消费者开始处理并在Queue中腾出空间。

我的问题是


我应该使用哪种最佳的BlockingQueue Impl,以便获得最佳的性能。
当“队列大小”为“满”时会发生什么,我的意思是无论生产者正在等待队列获取Vaccant,Servlet都将获取请求。那所有传入的请求呢?这些请求会去哪儿?那些要求是
是否存储在JVM内存中,并在不阻塞的情况下提供给生产者线程?


谢谢。

最佳答案

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

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

由于您的使用者速度慢而生产者速度很快,因此您不妨考虑增加使用者线程,以减少对Servlet调用者的阻塞体验。

另外,接受所有请求(即存储到无限制的Q中)也不是一个好的解决方案,因为(由于请求大小而定)由于消费者Q缓慢,在一段时间内可能会消耗大量内存。

07-25 22:47