【问题标题】:How can I run a method repeatedly for a set amount of time?如何在一定时间内重复运行一个方法?
【发布时间】:2021-06-21 11:55:42
【问题描述】:

我一直在使用 Schedule Executor 服务每 3 秒运行一次我的代码。在我的情况下,有没有办法每 3 秒运行 24 小时?我的代码看起来像这样。它的作用并不重要,因此我将其全部删除。我唯一关心的部分是List<String>,原因是在这 24 小时之后,我想用这个列表做更多的事情。

public static void main(String[] args) throws Exception {
    ScheduledExecutorService ses = Executors.newScheduledThreadPool(2);
    ses.scheduleWithFixedDelay(new Runnable() {
        
        // nonImportantVariables here

        List<String> importantList = new ArrayList<String>();
    
        public void run() {
            //Not important code
    }, 0, 3, TimeUnit.SECONDS);

    // AFTER 24 HOURS I WOULD LIKE TO PERFORM TASKS ON IMPORTANT LIST
    }
}

我考虑过添加一个循环,使其运行 28,800 次(即 24 小时内有多少 3 秒),但这似乎是一个愚蠢的解决方法,而且我也会遇到这样的问题代码需要多长时间才能运行,所以最终会更长。

我的第二个想法是,第一次运行迭代时,我可以使用 Date 对象。使用这个 Date 对象,我可以以某种方式在其上添加 24 小时,并有一些方法可以在第一次迭代 + 24 小时时将当前 Date 对象与 Date 对象进行比较。

我似乎在 Schedule executor service 的文档中找不到任何东西,我可以在其中设置运行命令的次数。非常感谢对这些想法或不同解决方案的任何改进。

【问题讨论】:

  • 为什么不安排另一个将在 24 小时后开始并关闭之前的服务的作业?
  • 我没想到!所以如果我从我的程序第一次启动开始设置一个 24 小时的延迟,它就会触发并在我的列表中执行操作。这会自动停止我的第一个服务还是我需要做一些特别的事情?
  • 只需调用您要关闭的服务的相应shutdown 方法即可。

标签: java scheduled-tasks


【解决方案1】:

您可以使用另一个调度程序,并在其中提交另一个任务,该任务将只运行一次,延迟 24 小时,它会做两件事。

  1. 关闭第一个调度程序,这将停止执行您的原始任务。
  2. 处理您的列表

【讨论】:

  • 所以在某种伪代码中它看起来像这样ScheduledExecutorService ses2 = new.... public void newMethod(){ shutdown my old service, Process my list, shutdown this service, re open my old service, delay for 24 hours?, }
  • 是的,除了你想连续运行整个 24 小时过程的最后一部分吗?你可以这样做,但你没有在你的问题中描述它是你想要做的
  • 抱歉,如果我不清楚。如果我给你一些背景信息可能会有所帮助。我每隔几秒钟就将堆栈跟踪读入一个列表。我想把所有这些都放在一个列表中,然后在 24 小时后用它们做一些事情。处理完这些列表后,我想清空此列表,并在接下来的 24 小时内每隔几秒再次读取内容并重复。
  • 我明白了。比,我可能会建议一个不同的设计。您创建一个调度程序,并安排一个任务在上一次运行结束后每 3 秒运行一次(而不是在上一次运行开始后 3 秒)。在第一次运行时,您写入启动时间并将堆栈跟踪写入列表。之后,您检查是否已过 24 小时,如果不只是添加到列表中。如果 24 小时过去了,那么你处理你的列表,清空它并写下当前时刻。以此类推。
  • 另外,我强烈建议您查看由我编写的 MgntUtils 开源库。它实际上可以帮助你很多。首先,它有一个实用程序可以智能地过滤堆栈跟踪并保留所有相关信息,但显着缩短堆栈跟踪。此外,还有一个生命周期管理 - 定制的调度程序已经做了你想做的事情,代码中的例子。这是 Javadoc 的链接:michaelgantman.github.io/Mgnt/docs
猜你喜欢
  • 2020-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-13
  • 2022-01-12
  • 1970-01-01
  • 2015-09-17
相关资源
最近更新 更多