diff --git a/spring-data-geode-test/src/main/java/org/springframework/data/gemfire/tests/util/ThreadUtils.java b/spring-data-geode-test/src/main/java/org/springframework/data/gemfire/tests/util/ThreadUtils.java index ffa5057..14c4e17 100644 --- a/spring-data-geode-test/src/main/java/org/springframework/data/gemfire/tests/util/ThreadUtils.java +++ b/spring-data-geode-test/src/main/java/org/springframework/data/gemfire/tests/util/ThreadUtils.java @@ -13,16 +13,20 @@ * or implied. See the License for the specific language governing * permissions and limitations under the License. */ - package org.springframework.data.gemfire.tests.util; +import java.time.Duration; import java.util.concurrent.TimeUnit; +import org.springframework.lang.NonNull; + /** * {@link ThreadUtils} is an abstract utility class for managing Java {@link Thread Threads}. * * @author John Blum * @see java.lang.Thread + * @see java.time.Duration + * @see java.util.concurrent.TimeUnit * @since 0.0.1 */ @SuppressWarnings("unused") @@ -40,37 +44,60 @@ public abstract class ThreadUtils { } } + public static boolean timedWait(@NonNull Duration duration) { + return timedWait(duration.toMillis()); + } + public static boolean timedWait(long duration) { return timedWait(duration, duration); } + public static boolean timedWait(@NonNull Duration duration, long interval) { + return timedWait(duration.toMillis(), interval); + } + public static boolean timedWait(long duration, long interval) { return timedWait(duration, interval, () -> true); } + public static boolean timedWait(@NonNull Duration duration, long interval, @NonNull Condition condition) { + return timedWait(duration.toMillis(), interval, condition); + } + @SuppressWarnings("all") - public static boolean timedWait(long duration, long interval, WaitCondition waitCondition) { + public static boolean timedWait(long duration, long interval, @NonNull Condition condition) { final long timeout = System.currentTimeMillis() + duration; interval = Math.min(interval, duration); try { - while (waitCondition.waiting() && (System.currentTimeMillis() < timeout)) { - synchronized (waitCondition) { - TimeUnit.MILLISECONDS.timedWait(waitCondition, interval); + while (!condition.evaluate() && System.currentTimeMillis() < timeout) { + synchronized (condition) { + TimeUnit.MILLISECONDS.timedWait(condition, interval); } } } - catch (InterruptedException e) { + catch (InterruptedException cause) { Thread.currentThread().interrupt(); } - return !waitCondition.waiting(); + return condition.evaluate(); } - // TODO rename interface to Condition and waiting() method to evaluate() - public interface WaitCondition { - boolean waiting(); + @FunctionalInterface + public interface Condition { + boolean evaluate(); + } + + /** + * @deprecated use {@link Condition}. + */ + @Deprecated + public interface WaitCondition extends Condition { + + default boolean waiting() { + return evaluate(); + } } }