2013-09-12 1 views
0

Я пытаюсь реализовать pGm-производитель-потребитель. Общий ресурс - очередь (массив объектов - размер 5). Продюсер добавляет объект и уведомляет Потребителя, когда q полностью ждет. Потребитель ждет, когда q пуст, иначе читает/удаляет и уведомляет производителя о том, что это сделано.Java-Где использовать wait in Consumer

Что я не в состоянии понять,

  1. Когда оповещает 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(); 
} 
    } 
    } 
} 

}

+0

Что такое потребительский код? – Omaha

+1

синхронизация должна принадлежать в коде очереди, а не в том, что касается ее доступа. –

+0

Наблюдение: то, что у вас есть, это стек, а не очередь. И теория: я начинаю задаваться вопросом, являются ли ваши пустые/полные предикаты неисправными - какой код для них? – Omaha

ответ

1

http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/BlockingQueue.html

Вы рассматривали использование очереди из параллельного пакета Java? Вам не придется вручную синхронизировать производитель и потребитель

EDIT:.

В этом случае вы можете забыть о синхронизации вашего продюсера а, й потребитель. Вместо этого, ваш класс очереди синхронизирует свои добавления и вызовы.

class Queue 
private final Object lock = new Object(); 
{ 
    public void add(Object item) 
    { 
    synchronized(lock) { 
     q[index] = item; 
     index++; 
    } 
    } 
    public Object get() 
    { 
    synchronized(lock) { 
     Object item = q[index - 1]; 
     index--; 
     return item; 
    } 
    } 
} 
+0

@Dodd -> Спасибо за ur tym .. Я знал, но не хотел 2 использовать встроенные 1s 4 dis ... – kushi

+0

Это гораздо лучший пример того, как выполнить реализацию add() и get() (синхронизация служебный объект или репозиторий - не те, кто вызывает функции). –

+0

@Dodd -> Я тоже пробовал этот 1, но, похоже, не решил проблему для меня ... – kushi

1

Этот вопрос нуждается повторно формулировка, но я считаю, что вопрос (связана с тем, что выглядит как домашнее задание) ...

«Что я не в состоянии понять, является 1) Когда извещает Producer после добавления obj потребитель не будет в состоянии ожидания, так что продюсер продолжает производить до тех пор, пока q не будет заполнен. Может кто-нибудь PLZ помочь, как преодолеть это ».

Логика для класса Продюсера кажется ясной, а реализация обоснованно правильной. То есть, Продюсер не заботится о деятельности Потребителя только в том, что Очередь остается полной. Предполагая, что Thread периодически запускается(), чтобы повторно заполнить очередность, в которой пользователи удаляют записи, Producer не должен ждать(), но просто выйдите, если очередь заполнена.

Таким образом:

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

Чего не хватает здесь есть на стороне потребителя, который должен ждать() или чек-обратно периодически, если очередь пуста (ожидание Производителю пополнения очереди).

+0

@ Darrell -> Сначала это не домашняя работа/задание :) просто играло вокруг диска 4 м длинный tym :(Хэ обновил класс Потребителя и dunno, как я забыл :( – kushi

+0

Хорошо - если это разрешило это, идите вперед и отметьте это как ответ. –

+0

@ Darrell -> Не удается получить ур путь fwd ... – kushi