public void release(){
  if (streaming)   return;
synchronized (this) {
    if (streaming)     return;
    streaming=true;
    if (observers.isEmpty() && iterators.isEmpty())     return;
    drained=true;
    for (    final E element : drain()) {
      dispatch(element);
    }
  }
}

public void release ( ) { if ( streaming ) return ; synchronized ( this ) { if ( streaming ) return ; streaming = true ; if ( observers . isEmpty ( ) && iterators . isEmpty ( ) ) return ; drained = true ; for ( final E element : drain ( ) ) { dispatch ( element ) ; } } }
called by the future ' s creator to begin streaming to iterators and observers .
