Java 具有区间划分的生产者-消费者

Java 具有区间划分的生产者-消费者,java,concurrency,partitioning,producer-consumer,java-threads,Java,Concurrency,Partitioning,Producer Consumer,Java Threads,我有一个有趣的生产者-消费者衍生产品要实现,我不能对它的算法掉以轻心。因此,每个生产者将在给定的范围(最小值、最大值)之间“产生”数字,该数字对除以给定的“商”给出相同的提示。消费者也是如此 额外要求:有限缓冲区 我的想法: 粗粒度队列使用一个锁和两个推送和弹出条件,以及许多预期参与方和到达参与方,用于确定队列的可用性。(如果队列中仍有项目或有活动写入程序(已到达!=预期),则认为队列可用) 一种“生产者类”,它包含最小值、最大值、商和共享队列作为字段,并有一个基于给定字段生成和返回值的方法

我有一个有趣的生产者-消费者衍生产品要实现,我不能对它的算法掉以轻心。因此,每个生产者将在给定的范围(最小值、最大值)之间“产生”数字,该数字对除以给定的“商”给出相同的提示。消费者也是如此

额外要求:有限缓冲区

我的想法:

  • 粗粒度队列使用一个锁和两个推送和弹出条件,以及许多预期参与方和到达参与方,用于确定队列的可用性。(如果队列中仍有项目或有活动写入程序(已到达!=预期),则认为队列可用)
  • 一种“生产者类”,它包含最小值、最大值、商和共享队列作为字段,并有一个基于给定字段生成和返回值的方法
  • 一个“Consumer”类,它包含与“Producer”类相同的字段,并具有“consume”方法,该方法从队列中弹出一个项目并“Consumer”(打印)它。只要队列可用,消费者就会消费
我的问题:

  • 如何确保给定工作负载间隔(开始、结束)之间的所有数字都由x生产者和y消费者生成和使用(x!=y)
  • 如何实现消费机制
  • 如何对生产者和消费者的值进行分区,以便使用工作负载间隔的所有值
我在考虑为“缓冲区”使用数组列表,每个使用者都会对要使用的“兼容”元素执行无锁查找,如果有可用的元素,则删除该元素,如果没有可用的元素,则重试。我认为这将是低效的,因为“尝试”浪费了CPU周期

PS:我使用java实现这一点,但伪代码也非常好


提前谢谢

为了确保producer从给定范围生成具有相同余数的所有数字,您可以使用以下伪代码

int current = start;
while (current++ <= end) { //assuming your ranges are inclusive
  if (current % quotient == 0) {
    publish(current);
  }
}
int current=start;

虽然(当前+)这将是一个好主意,不幸的是,我最多可以使用1个缓冲区。我看到的唯一要求是额外的要求:有限缓冲区。从技术上讲,您可能有几个缓冲区,其累积大小不超过预定义值。因此,您建议我可以将单个较大的缓冲区拆分为多个较小的缓冲区uffers。这可能确实有效。但我如何为555个消费者和1996个生产者共享缓冲区呢?