gpt4 book ai didi

Java - 多队列生产者消费者

转载 作者:行者123 更新时间:2023-11-30 11:12:19 26 4
gpt4 key购买 nike

我有以下代码:

    while(!currentBoard.boardIsValid()){
for (QueueLocation location : QueueLocation.values()){
while(!inbox.isEmpty(location)){
Cell c = inbox.dequeue(location);
notifyNeighbours(c.x, c.y, c.getCurrentState(),previousBoard);
}
}
}

我有一个消费者有几个队列(他们的所有方法都是同步的)。每个生产者一个队列。消费者遍历所有队列并检查他们是否有任务供他消费。如果他正在检查的队列中有任务,他就会使用它。否则,他将检查下一个队列,直到完成对所有队列的迭代。

截至目前,如果他遍历所有队列并且它们都是空的,他会继续循环而不是等待其中一个包含某些东西(如外部 while 所见) .

我怎样才能让消费者等待,直到其中一个队列中有东西?

我遇到以下情况的问题:假设只有 2 个队列。消费者检查了第一个,它是空的。就在他检查第二个队列(也是空的)时,生产者在第一个队列中放入了一些东西。就消费者而言,队列都是空的,所以他应该等待(即使其中一个队列不再是空的,他应该继续循环)。

编辑:最后一件事。这对我来说是一个练习。我正在尝试自己实现同步。因此,如果任何 Java 库有实现此功能的解决方案,我对它不感兴趣。我试图了解如何实现这一点。

最佳答案

@Abe 很接近。我会使用信号和等待 - 使用 Object 类内置函数,因为它们是最轻量级的。

Object sync = new Object();  // Can use an existing object if there's an appropriate one

// On submit to queue
synchronized ( sync ) {
queue.add(...); // Must be inside to avoid a race condition
sync.notifyAll();
}

// On check for work in queue
synchronized ( sync ) {
item = null;
while ( item == null ) {
// Need to check all of the queues - if there will be a large number, this will be slow,
// and slow critical sections (synchronized blocks) are very bad for performance
item = getNextQueueItem();
if ( item == null ) {
sync.wait();
}
}
}

注意 sync.wait 释放同步锁直到通知 - 同步锁是成功调用 wait 方法所必需的(它提醒程序员某些类型的临界区确实需要它才能可靠地工作)。

顺便说一句,如果可行的话,我会推荐专用于消费者(或消费者组)的队列,而不是专用于生产者的队列。它将简化解决方案。

关于Java - 多队列生产者消费者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26936299/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com