Реализовать многопоточный стек в Java? - PullRequest
1 голос
/ 13 июня 2019

Реализация многопоточного стека со свободой использования существующих реализаций стека.Помимо того, что он является поточно-ориентированным, он должен блокировать (не занятый-ждать) поток 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();
    }
  }
}
...