生产者 - 消费者生产一个项目并立即消费(Java)

时间:2016-12-29 12:33:53

标签: java multithreading producer-consumer

根据GeeksforGeeks-ProducerConsumerProblem,我对第二个练习感到困惑:

尝试让您的程序生成一个项目,然后消费者在消费者生产任何其他项目之前立即使用该项目。

如何解决? 我认为在制作人生成一个项目后,我们可以在生产者将一个项目添加到列表后记录大小。而while(list.size()== recordSize)wait(); 这是对的吗? 谢谢你的时间。

4 个答案:

答案 0 :(得分:1)

您可以使用标志变量,并且每次要生成项目时都需要验证此标志是否为false。 (如果您已经生成了一个项目,那么该标志为True,这样您就无法生成另一个项目,直到您知道消费者已经处理过它为止,您应该使用synchronized来保护此标志的值)。 现在,如果该标志为false,则添加一个项目然后wait()或仅wait()以供消费者使用它,然后在消费者代码中使用notify()继续。您还应该在消费者代码中使用wait()等待生产者生成项目,然后在完成后使用notify()wait()等待新项目。

答案 1 :(得分:0)

认为可以使用SynchronousQueue

解决问题

您还可以阅读有关herehere

的更多信息

这是使用自己的同步化结构的更好选择。

答案 2 :(得分:0)

制作人可以留下Future以供消费者填充。然后生产者调用Future的{​​{1}}方法,这将导致生产者线程停止直到消费者完成。这种解决方案本质上是现代的,因为它是在野外完成的方式。使用CountDownLatch可以完成相同的操作。锁存器和未来之间的区别在于,当生产者需要生成get()对象的持有者所需的对象时,使用Future。而Future主要用于同步多个线程。

虽然在此示例中要使CountDownLatchFuture工作,但需要对问题进行一些更改,例如CountDOwnLatch必须传递的不仅仅是LinkedList 。更简单的解决方案是将Integer换成SynchronousQueueLinkedList中包含零元素,因此当项目插入队列时,队列将阻塞,直到消费者来到并获取该项目。进一步尝试将SynchronousQueue对象放入put将阻止该项目被消耗。生产者可以在生产者完成前一个项目之前尝试将enxt项目放入队列,但是它将再次等待消费者来到并获得它。

答案 3 :(得分:0)

while (list.size() == capacity)替换为while (list.size() == 1)。这样,producer将只生产1件物品,并等待consumer消耗它。