@ SuppressWarnings ( "GoodTime" ) // should accept a java.time.Duration public boolean waitForUninterruptibly ( Guard guard , long time , TimeUnit unit ) { final long timeoutNanos = toSafeNanos ( time , unit ) ; if ( ! ( ( guard . monitor == this ) & lock . isHeldByCurrentThread ( ) ) ) { throw new IllegalMonitorStateException ( ) ; } if ( guard . isSatisfied ( ) ) { return true ; } boolean signalBeforeWaiting = true ; final long startTime = initNanoTime ( timeoutNanos ) ; boolean interrupted = Thread . interrupted ( ) ; try { for ( long remainingNanos = timeoutNanos ; ; ) { try { return awaitNanos ( guard , remainingNanos , signalBeforeWaiting ) ; } catch ( InterruptedException interrupt ) { interrupted = true ; if ( guard . isSatisfied ( ) ) { return true ; } signalBeforeWaiting = false ; remainingNanos = remainingNanos ( startTime , timeoutNanos ) ; } } } finally { if ( interrupted ) { Thread . currentThread ( ) . interrupt ( ) ; } } }
Waits for the guard to be satisfied . Waits at most the given time . May be called only by a thread currently occupying this monitor .