Add overloaded timedWait(..) methods taking a non-null java.time.Duration object.

Deprecate WaitCondition and introduce a new Condition interface.
This commit is contained in:
John Blum
2020-04-16 10:38:19 -07:00
parent 0b0150ee9c
commit 703e64a010

View File

@@ -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();
}
}
}