gpt4 book ai didi

java - 在日期/时间调用方法

转载 作者:行者123 更新时间:2023-11-30 07:42:16 25 4
gpt4 key购买 nike

我正在寻找一种现代方式来在给定日期/时间(特别是ZonedDateTime)执行给定方法。

我知道 Timer 类和 Quartz 库,如下所示(线程包括完整的解决方案):

但是这些线程相当陈旧,从那时起就没有使用新的 Java 特性和库元素。特别是,获取任何类型的 Future 对象都会非常方便,因为它们提供了一种简单的机制来取消它们。

所以请不要建议涉及TimerQuartz 的解决方案。另外,我想要一个 vanilla 解决方案,不使用任何外部库。但也可以出于问答的目的随意提出建议。

最佳答案

ScheduledExecutorService

您可以使用 ScheduledExecutorService ( documentation ) 类,从 Java 5 开始可用。它将产生一个 ScheduledFuture。 ( documentation ) 可用于监视执行并取消执行。

特别是方法:

ScheduledFuture<?> schedule​(Runnable command, long delay, TimeUnit unit)

哪个

Submits a one-shot task that becomes enabled after the given delay.

但您也可以根据实际用例( scheduleAtFixedRate 和接受 Callable 而不是 Runnable 的版本)研究其他方法。

自从 Java 8(Streams、Lambdas、...)以来,由于在旧的 TimeUnit 之间提供了简单的转换方法,此类变得更加方便。和更新的ChronoUnit (为您的 ZonedDateTime ),以及提供 Runnable command 的能力作为 lambda 或方法引用(因为它是 FunctionalInterface )。


例子

让我们看一个执行您要求的示例:

// Somewhere before the method, as field for example
// Use other pool sizes if desired
ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();

public static ScheduledFuture<?> scheduleFor(Runnable runnable, ZonedDateTime when) {
Instant now = Instant.now();
// Use a different resolution if desired
long secondsUntil = ChronoUnit.SECONDS.between(now, when.toInstant());

return scheduler.schedule(runnable, secondsUntil, TimeUnit.of(ChronoUnit.SECONDS));
}

调用很简单:

ZonedDateTime when = ...
ScheduledFuture<?> job = scheduleFor(YourClass::yourMethod, when);

然后您可以使用 job监视执行并在需要时取消它。示例:

if (!job.isCancelled()) {
job.cancel(false);
}

注意事项

您可以交换ZonedDateTime Temporal 方法中的参数, 然后它也接受其他日期/时间格式。

不要忘记关闭 ScheduledExecutorService当你完成时。否则,即使您的主程序已经完成,您也会有一个线程在运行。

scheduler.shutdown();

请注意,我们使用 Instant而不是 ZonedDateTime ,因为时区信息与我们无关,只要正确计算时差即可。 Instant始终以 UTC 表示时间,没有像 DST 这样的怪异现象。 (虽然对于这个应用程序来说并不重要,但它更干净)。

关于java - 在日期/时间调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55019047/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com