给定一个Clock,一个Instant和当前的Thread,Java库中是否有一些(实用)方法使当前线程休眠直到给定的时钟到达瞬间?
像
这样的东西public static void sleepUntil(Instant instant, Clock clock)
throws InterruptedException;
我需要在测试环境中使用自定义慢速时钟。
我知道它很容易实现,但我更喜欢标准解决方案(如果可用的话)(但到目前为止还没找到)。
答案 0 :(得分:1)
首先,Clock
是一个非常简单的类,只有implementation和few uses in the standard API。 SystemClock
,OffsetClock
和TickClock
是同一文件中的示例。所以答案似乎是不,它不在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);
}
}
对于固定时钟,这将永远循环。