gpt4 book ai didi

Java-Consumer中什么地方使用wait

转载 作者:行者123 更新时间:2023-12-02 06:44:46 24 4
gpt4 key购买 nike

我正在尝试实现一个生产者-消费者 pgm。共享资源是队列(对象数组,大小为 5)。生产者添加一个对象并通知消费者,当 q 已满时等待。消费者在 q 为空时等待,否则读取/删除并通知生产者已完成。

我无法理解的是

  1. 当生产者添加 obj 后通知时,消费者不会处于等待状态,因此生产者会继续生产,直到 q 满为止。

有人可以帮忙解决这个问题吗?我知道缺少一些简单的地方但无法弄清楚:(

class Queue
{
public void add(Object item)
{
q[index] = item;
index++;
}
public Object get()
{
Object item = q[index - 1];
index--;
return item;
}
public boolean isQfull()
{
System.out.println("Queue:index-->" + index);
if(index == 5)
{
return true;
}
return false;
}

public boolean isQEmpty()
{
if(index == 0)
{
System.out.println("Queue:isQEmpty");
return true;
}
return false;
}
}

class Producer extends Thread
{
public void run()
{
synchronized(q)
{
for(int i=0;i<20;i++)
{
if(q.isQfull())
{
q.wait();
}
else
{
q.add(i);
q.notify();
}
}
}
}
public class Consumer extends Thread
{
public void run()
{
synchronized(q)
{
while(true)
{
if(q.isQEmpty())
{
q.wait();
}
else
{
System.out.println("Consumer consuming" + q.get());
q.notify();
}
}
}
}

}

最佳答案

这个问题需要重新措辞,但我相信问题是(与看起来像家庭作业的内容有关)......

“我无法理解的是1)当生产者在添加obj后通知时,消费者将不会处于等待状态,因此生产者会继续生产直到q已满。任何人都可以帮助如何克服这个问题。”

Producer 类的逻辑似乎很清晰,并且实现相当正确。也就是说,生产者只关心队列是否已满,而不关心消费者 Activity 。假设线程定期 run() 来重新填充消费者正在从中删除条目的队列,则生产者不应 wait(),而应在队列已满时退出。

因此:

if (!q.isFull())
... add to queue and notify Consumers.

这里缺少的是消费者端需要 wait() 或在队列为空时定期检查(等待生产者补充队列)。

关于Java-Consumer中什么地方使用wait,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18771084/

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