我目前正在网络机器人中使用硒在网站上购买商品。当我搜索要购买的商品但找不到时,我使用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
类引入了新的方法,如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());
我认为与其睡觉,不如看看春季使用 cron 表达式的计划任务......这样你就不会有一个阻塞的线程只是坐在那里。
使用 Spring
cron 表达式的计划任务