docs: public long check() {
          long remaining = 0;
          lock.readLock().lock();
          try {
              if (this.timedout) {
                  // Note: this clears the interrupted flag if it was set
                  // Assumption is that the interruption was caused by the Timeout
                  boolean wasInterrupted = Thread.interrupted();
  
                  if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                      if (wasInterrupted) {
                          Tr.debug(tc, "{0}: Throwing timeout exception and clearing interrupted flag", getDescriptor());
                      } else {
                          Tr.debug(tc, "{0}: Throwing timeout exception", getDescriptor());
                      }
                  }
  
                  throw new TimeoutException(Tr.formatMessage(tc, "timeout.occurred.CWMFT0000E"));
              }
              long now = System.nanoTime();
              remaining = this.targetEnd - now;
  
              if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                  debugTime("?Start ", this.start);
                  debugTime("?Target", this.targetEnd);
                  debugTime("?Now   ", now);
                  debugTime("?Remain", remaining);
              }
          } finally {
              lock.readLock().unlock();
          }
          return remaining;
      }