code: public H2StreamProcessor createNewInboundLink(Integer streamID) {
          if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
              Tr.debug(tc, "createNewInboundLink entry: stream-id: " + streamID);
          }
          if ((streamID % 2 == 0) && (streamID != 0)) {
              synchronized (streamOpenCloseSync) {
                  int maxPushStreams = getRemoteConnectionSettings().getMaxConcurrentStreams();
                  // if there are too many locally-open active streams, don't open a new one
                  if (maxPushStreams >= 0 && openPushStreams > maxPushStreams) {
                      if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                          Tr.debug(tc, "createNewInboundLink cannot open a new push stream; maximum number of open push streams reached" + openPushStreams);
                      }
                      return null;
                  }
                  openPushStreams++;
  
              }
          }
          H2VirtualConnectionImpl h2VC = new H2VirtualConnectionImpl(initialVC);
          // remove the HttpDispatcherLink from the map, so a new one will be created and used by this new H2 stream
          h2VC.getStateMap().remove(HttpDispatcherLink.LINK_ID);
          H2HttpInboundLinkWrap link = new H2HttpInboundLinkWrap(httpInboundChannel, h2VC, streamID, this);
          H2StreamProcessor stream = new H2StreamProcessor(streamID, link, this);
  
          // for now, assume parent stream ID is root, need to change soon
          writeQ.addNewNodeToQ(streamID, Node.ROOT_STREAM_ID, Node.DEFAULT_NODE_PRIORITY, false);
          streamTable.put(streamID, stream);
          if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
              Tr.debug(tc, "createNewInboundLink exit: returning stream: " + streamID + " " + stream);
          }
          return stream;
      }
docs: Create a new stream and add it to this link. If the stream ID is even, check to make sure this link has not exceeded
  the maximum number of concurrent streams (as set by the client); if too many streams are open, don't open a new one.
  
  @param streamID
  @return null if creating this stream would exceed the maximum number locally-opened streams