根据GeeksforGeeks-ProducerConsumerProblem,我对第二个练习感到困惑:
尝试让您的程序生成一个项目,然后消费者在消费者生产任何其他项目之前立即使用该项目。
如何解决? 我认为在制作人生成一个项目后,我们可以在生产者将一个项目添加到列表后记录大小。而while(list.size()== recordSize)wait(); 这是对的吗? 谢谢你的时间。
答案 0 :(得分:1)
您可以使用标志变量,并且每次要生成项目时都需要验证此标志是否为false。 (如果您已经生成了一个项目,那么该标志为True,这样您就无法生成另一个项目,直到您知道消费者已经处理过它为止,您应该使用synchronized来保护此标志的值)。
现在,如果该标志为false,则添加一个项目然后wait()
或仅wait()
以供消费者使用它,然后在消费者代码中使用notify()
继续。您还应该在消费者代码中使用wait()
等待生产者生成项目,然后在完成后使用notify()
和wait()
等待新项目。
答案 1 :(得分:0)
答案 2 :(得分:0)
制作人可以留下Future以供消费者填充。然后生产者调用Future
的{{1}}方法,这将导致生产者线程停止直到消费者完成。这种解决方案本质上是现代的,因为它是在野外完成的方式。使用CountDownLatch可以完成相同的操作。锁存器和未来之间的区别在于,当生产者需要生成get()
对象的持有者所需的对象时,使用Future。而Future
主要用于同步多个线程。
虽然在此示例中要使CountDownLatch
或Future
工作,但需要对问题进行一些更改,例如CountDOwnLatch
必须传递的不仅仅是LinkedList
。更简单的解决方案是将Integer
换成SynchronousQueue。 LinkedList
中包含零元素,因此当项目插入队列时,队列将阻塞,直到消费者来到并获取该项目。进一步尝试将SynchronousQueue
对象放入put
将阻止该项目被消耗。生产者可以在生产者完成前一个项目之前尝试将enxt项目放入队列,但是它将再次等待消费者来到并获得它。
答案 3 :(得分:0)
将while (list.size() == capacity)
替换为while (list.size() == 1)
。这样,producer
将只生产1件物品,并等待consumer
消耗它。