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

时间:2009-08-07 09:08:32

标签: java multithreading queue

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

我正在使用LinkedBlockingQueue进行测试,但我收到了OutOfMemoryError异常。

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

  1. 制作人创建一个对象&排队。
  2. 消费者从队列中获取数据&插入数据库。将有400个生产者,我可以根据自己的意愿调整消费者。
  3. 让我知道任何想法。

    更新

    制作人:应该收听Server Socket。它从socket&读取数据。构造对象(Domain对象)并放入队列。

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

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

    有用的链接:

    vmoptions

    Monitoring and Managing Java SE 6 Platform Applications

    BlockingQueue

3 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:2)

每个生产者都是一个单独的线程吗?不要忘记每个线程将为其堆栈分配(默认情况下)512k的内存(在您的情况下,仅需要为线程提供200Mb的VM内存)。您可以通过-Xss

来减少这种情况

或者,您排队的对象有多大?我不认为你有一个队列问题,就像某种扩展问题一样 - 例如生产者生产速度快于消费者可以消费的。

答案 2 :(得分:1)

似乎LinkedBlockingQueue是您问题的最佳选择。我建议你使用开关-XX运行程序:+ HeapDumpOnOutOfMemoryError并分析转储文件以查看导致问题的原因。然后你就能够更容易地解决它。