1. 用户故事
我们在写业务代码的时候,经常会碰到某个地方需要暂停,检查某个资源是否准备就绪。只有资源就绪了才能继续执行。一般情况,我们就会写一个循环方法,在循环里去检查是否就绪;如果未就绪,就sleep下,再进行下一轮。
整个流程如下所示:
但是写多了之后就会发现,这些代码都大同小异。相同的都是循环+sleep,不同的则是判断方法(流程图蓝色方块)。完全可以抽象一下,把相同的部分复用,只写判断逻辑~
2. 如何实现
想法有了,怎么去实现呢?
Java8的 java.util.function 包中定义了一系列函数接口。如Function、Consumer、Predicate、Supplier等等。我们可以借助函数接口,将“判断方法”抽象出去。即将“判断方法”作为暂停方法的入参。
抽象判断方法
我们可以用Supplier接口,它不需要入参,且可以自定义返回类型。
@FunctionalInterface
public interface Supplier<T> {
/**
* Gets a result.
*
* @return a result
*/
T get();
}
很容易就能写一个判断方法,比如:
// 判断文件是否存在
private Supplier<Boolean> check(String file) {
return () -> new File(file).exists();
}
封装暂停工具
剩下的就是把循环+sleep方法封装下,变成一个通用的工具。
@Slf4j
public class PauseUtils {
public static void pause(Supplier<Boolean> supplier, int maxPauseSecond) {
int i = 0;
while (true) {
if (supplier.get()) {
log.info("supplier get");
return;
}
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
log.error("time sleep interrupted", e);
}
if (++i > maxPauseSecond) {
log.info("pause time over limit");
return;
}
}
}
}
大功告成!!!