繁体   English   中英

等待/睡眠直到 java 中的特定时间(例如星期四 10:59)

[英]Wait/sleep until a specific time (e.g. Thursday at 10:59) in java

我目前在 web 机器人中使用 selenium 在网站上购买商品。 当我搜索要购买的商品但找不到时,我使用driver.navigate().refresh()刷新页面以查看它现在是否存在,它将继续执行此操作,直到找到该商品在页面上发布。 但是,我希望在产品发布前几个小时启动我的机器人,该产品目前无法正常工作,因为在刷新页面大约 30 秒后,由于他们使用的反 ddos 软件,我被禁止访问该页面。 一种选择是增加刷新之间的延迟,但是我需要尽快赶上这个产品的发布,所以我试图找到一种方法,让我的程序可以等待/休眠到发布前 30 秒,但是我是努力寻找一种方法来做到这一点。

只需用适当的毫秒数调用Thread.sleep

public static void main(String[] args) throws InterruptedException {
    long currentTime = System.currentTimeMillis();
    long releaseTime = currentTime + 1000 * 60 * 60 * 24 * 3; // 3 days

    Thread.sleep(releaseTime - currentTime);
}

另一种方法是使用java.time类:

public static void main(String[] args) throws InterruptedException {
    LocalDateTime now = LocalDateTime.now();
    LocalDateTime release = LocalDateTime.of(2019, 10, 30, 13, 30);

    long sleepDuration = Duration.between(now, release).toMillis();
    TimeUnit.MILLISECONDS.sleep(sleepDuration);
}

Java 9 介绍了Duration class 的新方法,如toSeconds()toMinutes()等。

您还可以考虑使用ScheduledExecutorService来安排您的任务。 如果您要安排多个任务并且不希望为此阻塞多个线程,这将特别有用:

private static final ScheduledExecutorService service = new ScheduledThreadPoolExecutor(2);

private static ScheduledFuture<?> scheduleTask(Runnable task, LocalDateTime releaseTime) {
    Duration duration = Duration.between(LocalDateTime.now(), releaseTime);
    return service.schedule(task, duration.toSeconds(), TimeUnit.SECONDS);
}

一般来说,要睡到下周四的 10:59,您可以使用以下代码:

LocalDateTime release = LocalDateTime.now()
            .with(TemporalAdjusters.nextOrSame(DayOfWeek.THURSDAY))
            .withHour(10)
            .withMinute(59);

Duration duration = Duration.between(LocalDateTime.now(), release);
TimeUnit.MILLISECONDS.sleep(duration.toMillis());

我认为与其睡觉,不如看看 Spring 中带有 cron 表达式的计划任务......这样你就不会坐在那里被阻塞的线程。

Spring 的计划任务
Cron 表达式

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM