Maybe a backoff of Thread.yield in case the endTime is <50 millis from now?