Java 8中是否有一种方法可以使线程休眠直到使用特定时钟的瞬间?

时间:2015-09-30 15:43:39

标签: java java-8 java-time

给定一个Clock,一个Instant和当前的Thread,Java库中是否有一些(实用)方法使当前线程休眠直到给定的时钟到达瞬间?

这样的东西
public static void sleepUntil(Instant instant, Clock clock) 
 throws InterruptedException;

我需要在测试环境中使用自定义慢速时钟。

我知道它很容易实现,但我更喜欢标准解决方案(如果可用的话)(但到目前为止还没找到)。

3 个答案:

答案 0 :(得分:1)

首先,Clock是一个非常简单的类,只有implementationfew uses in the standard APISystemClockOffsetClockTickClock是同一文件中的示例。所以答案似乎是不,它不在default API

如果你被给予"减慢时钟"并且可能无法修改它以添加所需的sleepUntil() - 代码,并且减慢固定数量,您可以执行类似

的操作
public static void sleepUntil(Instant instant, Clock clock) 
    throws InterruptedException {

    Instant now = Instant.now(clock);
    long duration = now.until(instant, ChronoUnit.MILLIS);
    long testSleep
        = ( duration < 10000 )? (duration / 10) : 1000;
    long start = clock.millis();
    Thread.sleep(testSleep);
    long stop = clock.millis();
    double clockskew = (stop - start) / testSleep;

    now = Instant.now(clock);
    Thread.sleep(now.until(instant, ChronoUnit.MILLIS) * clockskew);
}

首先进行测试运行以确定时钟偏差,然后睡眠调整的持续时间

(也许您需要调整sleep中的瞬间以适应其他时钟。如果您希望对其进行测试/调整,请发布您的时钟代码。)

答案 1 :(得分:1)

就我而言,我需要等待特定的时间。 我的解决方案。

long expirationTime = System.currentTimeMillis() + 60_000;
Thread.sleep(expirationTime - System.currentTimeMillis());

另一种方法是使用do-while,但实际上,我看不到它的优点。

答案 2 :(得分:0)

我能看到的唯一方法是创建一个while循环,并在时钟到达给定时刻时从中断。

public static void sleepUntil(Instant instant, Clock clock) throws InterruptedException {
    while (clock.millis() < instant.toEpochMilli()) {
        Thread.sleep(1000);
    }
}

对于固定时钟,这将永远循环。