Multithreading 几个生产者,一个消费者:避免饥饿

Multithreading 几个生产者,一个消费者:避免饥饿,multithreading,concurrency,producer-consumer,Multithreading,Concurrency,Producer Consumer,举一个生产者-消费者问题的例子,几个生产者向一个消费者发送消息:当一些消息“同时”到达消费者时,您建议使用什么技术来避免生产者挨饿。到目前为止,我正在考虑: 通过抽样一些概率分布选择“非确定性”(考虑到不同数量的消息到达不同的时间戳,不确定如何) 使用一些计数器并在生产者发送n条消息后使其休眠一段时间 最简单也是最好的方法之一是按照消息到达的顺序处理消息(简单的FIFO列表就可以了)。即使多条消息同时出现也无所谓。这样一来,所有的生产者都不会挨饿 我要确保的一点是,消费者比生产者更快地消费信息。

举一个生产者-消费者问题的例子,几个生产者向一个消费者发送消息:当一些消息“同时”到达消费者时,您建议使用什么技术来避免生产者挨饿。到目前为止,我正在考虑:

  • 通过抽样一些概率分布选择“非确定性”(考虑到不同数量的消息到达不同的时间戳,不确定如何)
  • 使用一些计数器并在生产者发送n条消息后使其休眠一段时间

  • 最简单也是最好的方法之一是按照消息到达的顺序处理消息(简单的FIFO列表就可以了)。即使多条消息同时出现也无所谓。这样一来,所有的生产者都不会挨饿


    我要确保的一点是,消费者比生产者更快地消费信息。如果没有,它可能会在生产者中等待消费者,并且对于一个消费者有多个生产者没有任何好处。

    如果您可以有一个优先级队列,我认为每个生产者都可以有一个消息发送计数器。队列将根据messageSent编号和日期排序,这样,如果一条消息的发送编号小于另一条消息,则该消息应在另一条消息之前发送

    在爪哇

    class Message { //or you can implement Comparable<Message>
       final Date created = new Date();
       final int messageNumber; 
       public Message(int m ){this.messageNumber = m;}
    }
    BlockingQueue<Message> queue = new PriorityBlockingQueue<Message>(new Comparator(){
        public int compare(Message m1, Message m2){
            if(m1.messageNumber < m2.messageNumber) return 1;
            if(m2.messageNumber < m1.messageNumber) return -1;
            if(m1.messageNumber == m2.messageNumber) return m1.created.compareTo(m2.created);
        }
    });
    class Provider{
       int currentMessage = 0;
       void send(){
           queue.offer(new Message(currentMessage++));
       }
    }
    

    谢谢你的回复。不幸的是,他们会的。考虑一个生产者超快和另一个超级慢。这可能是因为速度慢的人永远没有机会被消耗掉。另外,考虑到你的第二种方法,我想很难找到“n”的理想值。很难想象你有一个互斥实现,它也不能提供最低的公平性保证。如果你用的那个有问题,就把它扔掉。这可能会导致饥饿。在您的示例中,如果producer 1继续添加元素,那么producer 2可能会无限期地陷入饥饿状态。制作人2永远不会被处理。不一定。我在答案底部显示的内容表明,P1:1将被处理,然后P2:1如果生产者2将另一个元素放入队列中,它将被放置在P1:2之后,如果P1继续在P1:1之前添加元素会发生什么情况。当P2永远不会在Java中处理时,BlockingPriorityQueue将最终允许P2添加到队列中。当P2添加到队列时,根据比较器的规则,他们的消息将被插入到所有P1消息之前。因此,即使P1继续增加,因为它们正在增加sentMessage计数P2的计数也将始终小于P1,因此下一步将被处理。你所说的最终是什么意思?
    P1: 5
    P1: 4
    P1: 3
    P1: 2
    P2: 1
    P1: 1