code: @Override
  	public E take() throws InterruptedException {
  		synchronized (waiting) {
  			if (closed) throw new InterruptedException("Channel closed");
  			waiting.add(Thread.currentThread());
  		}
  		E e = super.take();
  		synchronized (waiting) {
  			waiting.remove(Thread.currentThread());
  		}
  		return e;
  	}
docs: TODO add other methods to secure closing behavior