java - 哪个 Java 阻塞队列最适合多生产者和单个或多个消费者场景?

标签 java multithreading queue

哪个 Java 阻塞队列最适合多生产者和单个或多个消费者场景?

我正在使用 LinkedBlockingQueue 进行测试,但出现 OutOfMemoryError 异常。

我正在努力实现以下目标。

  1. 生产者创建一个对象并放入队列中。
  2. 消费者从队列中抓取数据并插入数据库。会有 400 个生产者,我可以根据需要调整消费者。

如果有任何想法,请告诉我。

更新

Producer : 它应该监听 Server Socket。它从套接字读取数据并构造对象(域对象)并放入队列中。

消费者:从队列中取出对象并插入数据库(支持 Hiberante 和连接池)

这是我的真实环境。流程应该能够处理至少 200 条记录/秒。我正在测试流程的可扩展性以及如何改进它。我希望这会提供更好的想法。

有用的链接:

vmoptions

Monitoring and Managing Java SE 6 Platform Applications

BlockingQueue

最佳答案

问题不在于您使用哪个 Queue 实现,而是如何解决限制生产者的问题如果您的消费者跟不上 .一种可能的解决方案是创建一个具有固定容量的 LinkedBlockingQueue,并让您的生产者调用 offer(E e),如果出现以下情况,它将返回 false队列已满。

另一种可能的解决方案是相应地调整生产者和消费者的数量。

关于java - 哪个 Java 阻塞队列最适合多生产者和单个或多个消费者场景?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1243733/

相关文章:

java - 部署到 AWS Elastic Beanstalk 后如何访问 servlet?

c - C Unix 中的段错误(核心转储)

c - 互斥锁已锁定,但其他线程正在进入临界区

java - ArrayBlockingQueue 和添加 vs 放置 vs 容量

c# - 队列 <byte> 与流

Laravel 队列作业自动处理,无需任何队列 :work or listen command

java - 如何在数组中创建单独的按钮名称?

java - Android EditText.setHint 在 fragment 中不起作用

c++ - 前向声明困惑

java - 访问其他 Java 类中的托管 CacheBean