private void waitForFutureTaskWithTimeout(Future submittedTask) {
    if (asyncCloseWaitTime != 0) {
      try {
        submittedTask.get(asyncCloseWaitTime, asyncCloseWaitUnits);
      } catch (InterruptedException | ExecutionException | TimeoutException e) {
        // We want this code to wait at most the asyncCloseWaitTime for the close to happen.
        // It is ok to ignore these exception and let the close continue
        // in the background.
      }
    }
  }
Closes the specified socket in a background thread. In some cases we see close hang.
Depending on how the SocketCloser is configured (see ASYNC_CLOSE_WAIT_MILLISECONDS)
this method may block for a certain amount of time. If it is called after the SocketCloser is
closed then a normal synchronous close is done.

@param socket the socket to close
@param address key used to determine which executor to use. Usually the address of a peer or
       client
@param runBeforeClose a Runnable with stuff to execute before the socket is closed
@param runAfterClose a Runnable with stuff to execute after the socket is closed
geode-core/src/main/java/org/apache/geode/internal/net/SocketCloser.java