У меня задание реализовать шаблон Producer-Consumer так, что-бы получилась блокирующая очередь. Producer добавляет в очередь, а Consumer из нее забирает. Если очередь пуста то потоки ждут до появления новых данных.
И что-то у меня получается совсем не внятное:
public class ProducerConsumer<E> {
private Queue<E> queue = new LinkedList<>();
private boolean permit = true;
private final static Object lock = new Object();
public void producer(E data) throws InterruptedException {
synchronized (lock) {
while (!permit) {
lock.wait();
}
queue.add(data);
switchPermit(true);
}
}
public E consumer() throws InterruptedException {
synchronized (lock) {
while (!permit || queue.size() == 0) {
lock.wait();
}
switchPermit(false); //и тут проблема он разбудит продюсера
return queue.poll(); //до того как сделает poll
}
}
private void switchPermit(boolean position) {
synchronized (lock) {
permit = position;
lock.notify();
}
}
}
Помогите пожалуйста написать такую очередь. Что-то я совсем запутался...
permit? – VladD Apr 06 '17 at 17:38