如何写一个普适的暂停方法

139 阅读1分钟

1. 用户故事

我们在写业务代码的时候,经常会碰到某个地方需要暂停,检查某个资源是否准备就绪。只有资源就绪了才能继续执行。一般情况,我们就会写一个循环方法,在循环里去检查是否就绪;如果未就绪,就sleep下,再进行下一轮。

整个流程如下所示:

未命名文件 (1).jpg

但是写多了之后就会发现,这些代码都大同小异。相同的都是循环+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;
            }
        }
    }
}

大功告成!!!