Java 单个生产者、多个阻塞队列、多个消费者

Java 单个生产者、多个阻塞队列、多个消费者,java,multithreading,algorithm,producer-consumer,blockingqueue,Java,Multithreading,Algorithm,Producer Consumer,Blockingqueue,Producer根据队列中的可用空间,查看每种消息类型并路由到任何阵列锁定队列。只有两种类型的消息类型1或类型2。给定队列只能包含一种消息类型。我想建立一个系统,其中可以有'm'队列,其中一些队列将包含类型1消息,其余将包含类型2消息。现在,每个队列可以有一个或多个使用者从中读取数据。队列到消费者的映射为1:n。每个消费者将从正好一个队列中消费 现在,我想要的功能是: 如果甚至有一个队列中有空格,生产者应该put()将消息放入该队列。只有当所有队列都已满时,生产者才应在put()上阻塞 只要队列

Producer根据
队列
中的可用空间,查看每种消息类型并路由到任何
阵列锁定队列
。只有两种类型的消息类型1或类型2。给定队列只能包含一种消息类型。我想建立一个系统,其中可以有'm'队列,其中一些队列将包含类型1消息,其余将包含类型2消息。现在,每个队列可以有一个或多个使用者从中读取数据。
队列
到消费者的映射为1:n。每个消费者将从正好一个队列中消费

现在,我想要的功能是:

  • 如果甚至有一个队列中有空格,生产者应该
    put()
    将消息放入该队列。只有当所有队列都已满时,生产者才应在
    put()
    上阻塞
  • 只要队列中有消息,在给定队列上等待的所有消费者都应该能够
    从队列中获取()
    ,并获得自己的消息
  • 多个使用者线程不应处理任何消息

  • 使用
    ArrayBlockingQueue
    ,这是否可能且优雅?还是有更好的解决方案

    为什么要使用n个队列而不是一个容量为n倍的队列?我们需要多个队列,这样系统就可以越来越具有可伸缩性。最终目标是使用尽可能多的消息。所以,我想要100个消费线程。如果只有一个队列,则每个线程都必须在BlockingQueue的“take()”方法后面进行同步。您是否对1000个使用者和(a)1个100000对象队列或(b)2个50000对象队列执行了两个简单测试?哪个测试完成得更早,额外的吞吐量值得增加的复杂性吗?您只有一个生产者。无论您扩展到多少消费者,他们处理队列中数据的速度永远不会超过生产者写入队列的速度。强制生产者处理多个队列,而不是每种消息类型一个队列,会导致生产者的开销。@JeffHolt,我刚刚这样做了,对于1000个消费者,只有一个队列,实际上模拟并没有暴露太多争用。我让每个制作人每10毫秒生成一条消息。每个消费者需要200毫秒来处理一条消息。在10秒内,总共生产了894个,消费了878个。老实说,那场演出对我们来说已经足够了。有趣的是,我真的认为从一个队列读取数据将被证明是一个瓶颈,这将大大降低消耗率。为什么要使用n个队列,而不是一个容量为n倍的队列?我们想要多个队列,这样系统就可以越来越可伸缩。最终目标是使用尽可能多的消息。所以,我想要100个消费线程。如果只有一个队列,则每个线程都必须在BlockingQueue的“take()”方法后面进行同步。您是否对1000个使用者和(a)1个100000对象队列或(b)2个50000对象队列执行了两个简单测试?哪个测试完成得更早,额外的吞吐量值得增加的复杂性吗?您只有一个生产者。无论您扩展到多少消费者,他们处理队列中数据的速度永远不会超过生产者写入队列的速度。强制生产者处理多个队列,而不是每种消息类型一个队列,会导致生产者的开销。@JeffHolt,我刚刚这样做了,对于1000个消费者,只有一个队列,实际上模拟并没有暴露太多争用。我让每个制作人每10毫秒生成一条消息。每个消费者需要200毫秒来处理一条消息。在10秒内,总共生产了894个,消费了878个。老实说,那场演出对我们来说已经足够了。有趣的是,我真的认为从一个队列中阅读将被证明是一个瓶颈,这将大大降低消费率。