Реализация многопоточного стека со свободой использования существующих реализаций стека.Помимо того, что он является поточно-ориентированным, он должен блокировать (не занятый-ждать) поток push-сообщений, когда стек заполнен, и поток-прерыватель, когда стек пуст.Он должен сигнализировать о том, что потоки не спят, когда в стеке снова есть место или элементы должны появиться.Справедливость не является обязательной в этом вопросе.
Как я могу реализовать такой стек в Java?Я придумал реализацию ниже.Это правильный способ решить вышеуказанную проблему?
public class MyStack<E> {
private final Stack<E> stack;
private int max = 16;
private final ReentrantLock lock = new ReentrantLock(true);
private final Condition notEmpty = lock.newCondition();
private final Condition notFull = lock.newCondition();
public MyStack(int size) {
this.stack = new Stack<>();
this.max = size;
}
public void push(E e) {
lock.lock();
try {
while (stack.size() == max) {
notFull.await();
}
stack.push(e);
notEmpty.signalAll();
} catch (InterruptedException e1) {
e1.printStackTrace();
} finally {
lock.unlock();
}
}
public E pop() {
lock.lock();
try {
while (stack.size() == 0) {
notEmpty.await();
}
E item = stack.pop();
notFull.signalAll();
return item;
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}