Date 在Java8中使用LocalTime,直到当前时间是给定时间之前的60秒?

Date 在Java8中使用LocalTime,直到当前时间是给定时间之前的60秒?,date,time,java-8,blocking,Date,Time,Java 8,Blocking,我想就解决我遇到的问题的最佳方法提出一些建议 我希望我的程序阻塞,直到当前时间比给定时间早60秒,使用Java8中的LocalTime 所以它会是这样的: LocalTime time1 = LocalTime.of(13, 11) LocalTime currentTime = LocalTime.now() 然后是一些实现一些逻辑的代码,比如:Thread.sleep(直到currentTime

我想就解决我遇到的问题的最佳方法提出一些建议

我希望我的程序阻塞,直到当前时间比给定时间早60秒,使用Java8中的LocalTime

所以它会是这样的:

LocalTime time1 = LocalTime.of(13, 11)
LocalTime currentTime = LocalTime.now()
然后是一些实现一些逻辑的代码,比如:Thread.sleep(直到currentTime
任何帮助都会很好,谢谢

使用
LocalTime
minusSeconds
方法将时间调整60秒(或使用
minusmiconds
)。然后使用
Duration.between
获取两次之间的持续时间:

LocalTime time1 = LocalTime.of(13, 11);

LocalTime untilTime = time1.minusSeconds(60);

LocalTime currentTime = LocalTime.now();

Duration duration = Duration.between(currentTime, untilTime);

// TODO possibly check duration.isNegative()

Thread.sleep(duration.toMillis());

好吧,将一个
LocalTime
转换成一个
LocalTime
,相差60秒是微不足道的。但是,虽然很容易计算与
LocalTime.now()的差异以获得等待时间,但在计算差异时存在时间流逝的问题,因此在调用wait函数时,该值已经不准确

虽然在多任务系统中等待时通常存在不精确性,即等待后会出现任意执行速度和线程调度,但应避免额外提高执行速度和线程调度

更好的解决方案是计算一个截止日期,即使它看起来稍微复杂一点,然后等待到达截止日期:

LocalTime target = LocalTime.of(12, 50).minusSeconds(60);
long deadLine = target.atDate(LocalDate.now()).atZone(ZoneId.systemDefault())
                      .toInstant().toEpochMilli();
while(System.currentTimeMillis() < deadLine) {
    // in case you want to support interruption:
    if(Thread.interrupted())
        throw new InterruptedException();
    LockSupport.parkUntil(target, deadLine);
}
展示正在发生的事情。另外,如果等待时间足够长,另一个线程可以调用并检查返回的对象