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:
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user