如何使用以下属性完成“等待空闲”模型:
- 当一个方法
do()
被调用时,经过X延迟,一个close()
方法将被调用。 - 如果我在 X 时间过去之前再次调用
do()
方法,则必须推迟对close()
的调用。
示例
场景 1:(超时 = 10 秒):
- 用户在时间
0
调用了do()
。 - 在时间
10
,close()
方法被调用,因为用户没有再次调用do()
。
场景 2:(也是超时 = 10 秒):
- 用户在
0
时调用了do()
。 (所以在10
应该调用close()
方法)。 - 在
8
时,用户再次调用do()
。 - 在
10
时没有任何反应,因为close()
被推迟了 10 秒。 - 在
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/