synchronized void registerStreams(int operationId, List<OperationResponse.StreamEntry> streams) {
        // ^^^ synchronize on 'this' to avoid races with shutdown

        if (!stopped) {
            // Streams share a timestamp so activity on any is sufficient to keep the rest alive
            AtomicLong timestamp = new AtomicLong(System.currentTimeMillis());
            for (int i = 0; i < streams.size(); i++) {
                OperationResponse.StreamEntry stream = streams.get(i);
                InputStreamKey key = new InputStreamKey(operationId, i);
                streamMap.put(key, new TimedStreamEntry(stream, timestamp));
            }
        } else {
            // Just close the streams, as no caller ever will
            for (int i = 0; i < streams.size(); i++) {
                closeStreamEntry(streams.get(i), operationId, i);
            }
        }
    }
synchronized void registerStreams ( int operationId , List < OperationResponse . StreamEntry > streams ) { if ( ! stopped ) { AtomicLong timestamp = new AtomicLong ( System . currentTimeMillis ( ) ) ; for ( int i = 0 ; i < streams . size ( ) ; i ++ ) { OperationResponse . StreamEntry stream = streams . get ( i ) ; InputStreamKey key = new InputStreamKey ( operationId , i ) ; streamMap . put ( key , new TimedStreamEntry ( stream , timestamp ) ) ; } } else { for ( int i = 0 ; i < streams . size ( ) ; i ++ ) { closeStreamEntry ( streams . get ( i ) , operationId , i ) ; } } }
Registers a set of streams that were associated with a particular request. Does nothing if {@link #shutdown()}
has been invoked, in which case any use of the {@link #getReadHandler() read handler} will result in behavior
equivalent to what would be seen if the the registered stream had 0 bytes of content.

@param operationId id of the request
@param streams the streams. Cannot be {@code null} but may be empty