【发布时间】:2014-11-14 18:09:55
【问题描述】:
我有以下代码:
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 库都有实现此功能的解决方案,我对此不感兴趣。我试图了解如何实现这一点。
【问题讨论】:
-
除非您可以修改生产者以执行额外的信号/通知,否则有两种解决方案,1) 使用超时并在 CPU 消耗和响应性之间进行权衡,或者 2) 使用额外的线程在队列中等待并通知消费者。第二种方法的额外线程会消耗更多内存,但不会占用大量 CPU 时间,因为它们大部分时间都在等待。
标签: java multithreading producer-consumer