java - "postpone"任务真的那么难(或 "wait for idle")

标签 java timer scheduled-tasks

如何使用以下属性完成“等待空闲”模型:

  • 当一个方法do()被调用时,经过X延迟,一个close()方法将被调用。
  • 如果我在 X 时间过去之前再次调用do() 方法,则必须推迟对close() 的调用。

示例

场景 1:(超时 = 10 秒):

  1. 用户在时间 0 调用了 do()
  2. 在时间 10close() 方法被调用,因为用户没有再次调用 do()

场景 2:(也是超时 = 10 秒):

  1. 用户在 0 时调用了 do()。 (所以在 10 应该调用 close() 方法)。
  2. 8 时,用户再次调用 do()
  3. 10 时没有任何反应,因为 close() 被推迟了 10 秒。
  4. 18 时,调用了 close() 方法,因为自从 之后用户没有再次调用 do() 8

我尝试过的:

private static final long delay = 10000;
private Timer t;
private TimerTask tt;

public void do() {

    ...

    // check old timer first:
    if (t != null) t.cancel();

    // create new timer
    t = new Timer();
    tt = new TimerTask() {
        @Override
        public void run() {
            close();
        }
    }
    // run it
    t.schedule(tt, System.currentTimeMillis() + delay);
}
private void close() {
    // do some cleanup here
}

这段代码非常难看。 这也是非常低效和消耗内存的,因为 do() 函数每秒被调用大约 50 次。

我应该怎么做才能使它以高效和整洁的方式工作? (真的有那么难吗?)

最佳答案

你走在正确的道路上,这并不难。

这是我想给你的建议。只创建一次定时器。使其成为类(class)成员。在构造函数中创建它的实例。

当方法被调用时,像您现在所做的那样创建一个任务。然而,您可以创建单独的类,甚至提前创建它的实例,当 do() 方法被调用时,只需安排它,因此 close() 将根据您的日程。

do() 被调用时,取消之前创建的关闭任务。这将确保您不会在再次调用方法 do() 时关闭任何内容。

顺便说一句,因为 do 是 java 中的保留字,所以您不能以这种方式调用方法。这意味着您的代码甚至无法编译。更改名称。

关于java - "postpone"任务真的那么难(或 "wait for idle"),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15557109/

相关文章:

timer - Fortran 内在计时例程,哪个更好? cpu_time 或 system_clock

c# - 在不使用私有(private)成员的情况下保持 System.Threading.Timer 处于事件状态

swift - 在循环内使用dispatch_after延迟

java - 将 Windows/Eclipse 中的 Java 连接到 ScotchBox Vagrant Box MySQL 数据库

java - 我无法正确编译此代码。我究竟做错了什么?

java - 如何让我的 JPanels/JFrames 真正显示出来?

python - 使用新参数安排python脚本重新启动或对象重新初始化

java - 从不同类中的文件读取和写入,而无需关闭java中的流

python - 如何从redis中排队rq中的工作

django - 使用 Django 和 Elastic beanstalk 实现并行任务的最佳方式是什么?