给定一个生产者-消费者问题的实例,其中多个生产者将消息发送给单个消费者:当一些消息“同时”到达消费者时,建议使用什么技术避免生产者的饥饿。到目前为止,我正在考虑:
最佳答案
如果您可以拥有一个优先级队列,我认为每个生产者都可以向计数器发送一条消息。队列将根据messageSent编号和日期进行排序,因此,如果一条消息的发送数量小于另一条消息,则该消息应在另一条消息之前发送。
在Java中
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++));
}
}
因此,如果生产者1向队列中添加5个元素(第一个),而生产者2向队列中添加1个元素,则该队列将具有
P1: 5
P1: 4
P1: 3
P1: 2
P2: 1
P1: 1
关于multithreading - 几个生产者,一个消费者: Avoid starvation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15708380/