docs: @Override
      protected void updateSelector() {
          final Queue<Object> work = getWorkQueue();
          if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
              Tr.debug(this, tc, "updateSelector - processing " + work.size() + " items");
          }
          ConnectInfo ci = null;
          while (!work.isEmpty()) {
              ci = (ConnectInfo) work.remove();
              try {
                  ci.channel.register(selector, SelectionKey.OP_CONNECT, ci);
                  if (ci.timeout != TCPConnectRequestContext.NO_TIMEOUT) {
                      ci.nextTimeoutTime = System.currentTimeMillis() + ci.timeout;
                      if (ci.nextTimeoutTime < nextTimeoutTime) {
                          nextTimeoutTime = ci.nextTimeoutTime;
                      }
                  }
                  updateCount();
  
              } catch (ClosedChannelException e) {
                  if (TraceComponent.isAnyTracingEnabled() && tc.isEventEnabled()) {
                      Tr.event(this, tc, "SocketChannel connect failed, " + e + " local: " + ci.ioSocket.getSocket().getLocalSocketAddress() + " remote: "
                                         + ci.ioSocket.getSocket().getRemoteSocketAddress());
                  }
                  // Call a separate worker thread to call the callback. Don't hold up
                  // this selector thread.
                  ci.setError(e);
                  if (!wqm.dispatchConnect(ci)) {
                      // error could not be dispatched, so put request back on work queue
                      // and let it fail again later
                      addWork(ci);
                  }
              }
          } // process all work queue items.
  
          if (ci != null) {
              // if we added anything, reset quit flags
              waitingToQuit = false;
              quit = false;
          }
      }