gpt4 book ai didi

java - 让线程 hibernate 直到设定的日期?

转载 作者:行者123 更新时间:2023-12-02 09:00:30 27 4
gpt4 key购买 nike

我想知道如何让线程 hibernate 直到设定日期,例如设定日期 2020 年 2 月 14 日。

线程在此日期之前将保持 sleep 状态。有没有办法在java中做到这一点?

最佳答案

执行者服务

定义 Runnable (或可调用)。这意味着只需使用一个 run 方法来遵守接口(interface)的约定。

在 lambda 语法中:

Runnable runnable =
() -> {
System.out.println( "Looking up fresh stock prices at " + Instant.now().toString() ) ;
}
;

接下来,研究现代 Java 中内置的 Executors 框架。请参阅Oracle Tutorial 。这个框架极大地简化了线程上调度工作的棘手工作。

具体来说,您想使用 ScheduledExecutorService 。该接口(interface)用于安排任务在特定时间运行一次(实际上是在特定延迟到期后运行一次),重复运行任务。你当然想要前者。

Executors 获取实现类(class)。为了满足您的需求,我们只需要一个单线程。在其他情况下,您可能需要使用线程池。

ScheduledExecutorService ses = Executors.newSingleThreadScheduledExecutor() ;

指定任务执行之前等待的时间(延迟)。计算需要等待的时间。

指定您的目标日期。在实际工作中,我会验证该日期确实是 future 的日期。

LocalDate localDate = LocalDate.of( 2020 , Month.FEBRUARY , 23 ) ;

我们需要一个特定的时刻,而不仅仅是一个日期。我想你会想要那天的第一刻。不要假设现在是 00:00。某些日期的某些区域中的某些日子可能会在其他时间开始,例如 01:00。始终让 java.time 确定第一个时刻。

ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
ZonedDateTime zdt = localDate.atStartOfDay( z ) ;

从该时区转换为 UTC。

Instant then = zdt.toInstant() ;

捕捉 UTC 中的当前时刻。

Instant now = Instant.now() ;

将耗时计算为 Duration .

Duration d = Duration.between( now , then ) ;

现在安排我们的任务在延迟到期后运行。我建议增加一点时间,以确保所有相关系统的所有时钟都顺利进入新的一天。再加上午夜往往是Witching Hour用于计算,然后运行许多 cron 作业、日志滚动、实用程序和报告。也许添加几分钟或更长时间。

ses.scheduleWithFixedDelay( runnable , d.plusMinutes( 7 ).toMinutes() , TimeUnit.MINUTES);

您可以选择捕获返回的 ScheduledFuture监控您的任务。

重要请务必在不再需要时或在您的应用程序关闭时正常关闭您的执行程序服务。否则,您的线程可能会在应用程序退出后继续在后台运行。

ses.shutdown() ;

关于java - 让线程 hibernate 直到设定的日期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60206275/

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