当前位置: 首页 > 知识库问答 >
问题:

用java调度周期性任务

韩高峯
2023-03-14

我正在开发一个登录网站的程序。它获得一些值,然后每135分钟左右在网站上进行一定的点击。值,“obtained_value”是从网站上读取的,每次点击程序都会递减一些值。我想运行程序,直到获得的值小于10。一旦发生这种情况,我想暂停程序直到达到目标时间并重新启动点击循环。我想在每次达到目标时间时都这样做。我在以下代码中实现了这个逻辑,但我的代码在达到目标时间后保持睡眠,而不是重新启动循环。我如何解决这个问题?

        while (true) {
        var remainder = driver.findElement(By.xpath(
                "/html/body/uni-app/uni-page/uni-page-wrapper/uni-page-body/uni-view/uni-view[3]/uni-view[2]/uni-view[2]")).getText();
        var remaining = Double.parseDouble(remainder);
        
        var last_time = driver.findElement(By.xpath(
                "/html/body/uni-app/uni-page/uni-page-wrapper/uni-page-body/uni-view/uni-view[5]/uni-view[3]/uni-view[1]")).getText();

        Calendar date = Calendar.getInstance();
        date.setTime(new SimpleDateFormat("MM-dd HH:mm", Locale.ENGLISH).parse(last_time)); // Parse into Date object
        date.set(Calendar.YEAR, 2022);
        var obtained_value = date.getTime().getTime();

        long current_time = Calendar.getInstance().getTimeInMillis(); // Get time now
        long target_time = obtained_value + 7920000;
        long millis = target_time - System.currentTimeMillis();

        if (millis <= 0) {
            if (remaining > 5) {
                driver.findElement(By.className("orderBtn")).click();
                driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
                Thread.sleep(6000);
                driver.findElement(By.xpath("/html/body/uni-app/uni-page/uni-page-wrapper/uni-page-body/uni-view/uni-view[7]/uni-view/uni-view/uni-view[6]/uni-button[2]")).click();
                driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
                Thread.sleep(6000);
                driver.findElement(By.xpath("/html/body/uni-app/uni-page/uni-page-wrapper/uni-page-body/uni-view/uni-view[8]/uni-view/uni-view/uni-button")).click();
            }
        }
        try {
           if(millis > 0)
              Thread.sleep(millis);
            else
                continue;
        } catch (InterruptedException e) {
            throw new RuntimeException(e.getMessage(), e);
        }
    }

从线程开始,代码在到达指定时间后中断是有意义的。睡眠不接受负值,但我现在不知道如何避开这个错误。如何在每次线程中恢复循环。达到睡眠时间(毫秒)?此时,即使在达到目标时间后,程序仍保持睡眠状态。

共有1个答案

易京
2023-03-14

您的问题与此非常相似:您能否使用无限循环来使用java连续运行程序。主要的一点是,为了安排重复发生的任务,您应该使用ScheduledExecutorService,该服务可以从执行者那里获得。newScheduledThreadPool(int corePoolSize)方法。一旦您注意到获得的值小于10,您应该关闭ScheduledExecutorService,并创建一个新的服务,您可以使用它来安排您的R任务在指定的时间以所需的时间间隔开始。

 类似资料:
  • 执行周期性任务也是一样简单,您只需要编写一行代码: RecurringJob.AddOrUpdate(() => Console.Write("Easy!"), Cron.Daily); 此行在持久存储中创建一个新实体。 Hangfire Server中的一个特殊组件(请参阅 处理后台任务) 以分钟为间隔检查周期性任务,然后在队列中将其视作 fire-and-forget 任务。这样就可以照常跟踪

  • 我尝试定期在JavaFX应用程序后台线程中运行,这修改了一些GUI属性。 我想我知道如何使用和类从和不能弄清楚如何运行这样的周期性任务不使用方法。这将是很好的,如果我可以使用一些从编造方法() 我试图每5秒运行,这会重新启动,但它会立即挂起,因为甚至被调用... 最后我使用执行器。newSingleThreadScheduledExecutor(),它每5秒启动一次my,并使用以下命令运行另一个:

  • 可以通过设置任务详情页中的周期,实现建立周期性任务。比如“周例会”

  • 我很难找到有关 Xamarin.Forms 的后台任务支持的文档。Xamarin.Forms 是否为定期后台任务提供支持? 我需要为Windows手机10和Android实现它。

  • 假设我有一些账单,上面有开始日期和结束日期。 我要检查的商业规则是 例如,3月10日到4月9日大约相隔一个月,所以我用它来检查任何两个连续的账单开始日期(4月10日和3月10日)是否相隔一个月。 现在我的问题是求周期的长度。例如,假设我有以下数据集 我正在使用JodaTime库,所以我说类似这样的话 它返回0,这是正确的,但没有用处。 结果是1,尽管相隔一天。 有什么更好的方法来做到这一点?我可以

  • 项目中有一个要求,该要求将具有将完成某些工作的计划任务。 该项目是基于Spring的,计划的作业将是应用程序大战的一部分。我以前从未实现过这种功能。 我听说过Quartz。此外,我在某处读到Spring提供了一些功能来安排任务。所以,我在想如果我已经在使用Spring,那么为什么要使用其他API(Quartz)。 我不确定使用哪一个?一个比另一个的优缺点是什么? 请提出满足我要求的最佳方式。