Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
生产者消费者生产一件商品并立即消费(Java)_Java_Multithreading_Producer Consumer - Fatal编程技术网

生产者消费者生产一件商品并立即消费(Java)

生产者消费者生产一件商品并立即消费(Java),java,multithreading,producer-consumer,Java,Multithreading,Producer Consumer,据我所知,我对第二个练习感到困惑: 尝试让您的程序生成一个项目,然后消费者立即消费该项目,然后消费者再生成任何其他项目 如何解决? 我认为在制作人制作一个项目后,我们可以在制作人将一个项目添加到列表后记录大小。和while(list.size()==recordSize)wait(); 对吗? 谢谢您的时间。您可以使用一个标志变量,每次您想要生成一个项目时,您都需要验证该标志是否为false。(如果您已经生产了一个项目,因此在知道消费者已处理该项目之前无法生产另一个项目,则该标志为真,您应使用s

据我所知,我对第二个练习感到困惑:

尝试让您的程序生成一个项目,然后消费者立即消费该项目,然后消费者再生成任何其他项目

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

您可以使用一个标志变量,每次您想要生成一个项目时,您都需要验证该标志是否为false。(如果您已经生产了一个项目,因此在知道消费者已处理该项目之前无法生产另一个项目,则该标志为真,您应使用synchronized保护该标志的值)。
现在,如果标志为false,则添加一个项目,然后添加
wait()
,或者只添加
wait()
,让消费者消费它,然后在消费者代码中使用
notify()
,继续。您还应该在消费者代码中使用
wait()
等待生产商生产商品,然后在完成后使用
notify()
wait()
等待新商品。

我想通过使用

你也可以阅读更多关于它和


这是一个比使用自己的同步构造更好的选择。

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


虽然要使
未来
倒计时闩锁
在此示例中工作,需要对问题进行一些更改,例如
链接列表
必须传递的不仅仅是一个
整数
。一个更简单的解决方案是用一个。
SynchronousQueue
中包含零个元素,因此当项目插入队列时,队列会阻塞,直到消费者来取项目。进一步尝试
将对象放入
SynchronousQueue
将被阻止,直到该项目被消费。制作人可以尝试在制作人完成上一个项目之前将下一个项目放入队列,但它会再次在那里等待消费者出现并获取它。

while(list.size()==capacity)
替换为
while(list.size()=1)
。通过这样做,
producer
将只生产1个项目,并等待
消费者
消费它。

虽然在解决问题时没有任何改变,但您对SynchronousQueue的描述与JavaDoc相矛盾-它没有容量,因此,即使是第一个
put
操作,在相应的
remove
到达之前也不会完成。@Deltharis correct,将调整我的句子以说明这一点。谢谢斯认为这正是他们在运动中想要的,就像讨论这个论坛是什么,在某种程度上,这不是一个开放式的论坛来阅读一个家庭作业的问题并回答它。相反,在尝试解决自己的问题后,问一个特定的问题(例如生成错误或错误的结果,发布该问题,然后问行或结构有什么问题)。见: