【发布时间】:2013-03-11 12:41:04
【问题描述】:
如何使用属性完成“等待空闲”模型:
- 当调用
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()方法被调用,因为自从8之后用户没有再次调用do()。
我尝试过的:
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 次。
我应该怎么做才能让这项工作以一种高效而整洁的方式工作? (真的有那么难吗?)
【问题讨论】:
-
你为什么一遍又一遍地创建
Timer?您应该重复使用一个计时器,并且只在其上取消/安排任务。当你解决这个问题时,不会有任何低效和消耗内存的问题。 -
Exception in thread "main" java.lang.IllegalStateException: Task already scheduled or cancelled -
@MarkoTopolnik - 您无法在已取消的计时器上安排任务。
-
@Perception 当然。这就是为什么您不要取消计时器。你取消了任务。
-
@MarkoTopolnik - 没关系,我知道你在哪里说任务与计时器。
标签: java timer scheduled-tasks