Я пытаюсь реализовать pGm-производитель-потребитель. Общий ресурс - очередь (массив объектов - размер 5). Продюсер добавляет объект и уведомляет Потребителя, когда q полностью ждет. Потребитель ждет, когда q пуст, иначе читает/удаляет и уведомляет производителя о том, что это сделано.Java-Где использовать wait in Consumer
Что я не в состоянии понять,
- Когда оповещает Producer после добавления OBJ, потребитель не будет в состоянии ожидания, так что производитель продолжает производить, пока д полна.
Может ли кто-нибудь помочь вам, как это преодолеть. Я знаю, что где-то просто отсутствует, но я не в состоянии наряжать :(
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();
}
}
}
}
}
Что такое потребительский код? – Omaha
синхронизация должна принадлежать в коде очереди, а не в том, что касается ее доступа. –
Наблюдение: то, что у вас есть, это стек, а не очередь. И теория: я начинаю задаваться вопросом, являются ли ваши пустые/полные предикаты неисправными - какой код для них? – Omaha