如何使用以下属性完成“等待空闲”模型:
- 当一个方法
do()
被调用时,经过X延迟,一个close()
方法会被调用。 - 如果我在X 时间过去之前
do()
再次调用该方法,则必须推迟调用 to。close()
例子
场景 1:(超时 = 10 秒):
do()
用户按时打电话0
。- 在 time
10
,该close()
方法被调用是因为用户没有do()
再次调用。
场景 2:(也超时 = 10 秒):
do()
用户按时打电话0
。(所以应该调用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 次。
我应该怎么做才能以一种高效而整洁的方式工作?(真的有那么难吗?)