[英]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 表达式的计划任务......这样你就不会坐在那里被阻塞的线程。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.