如何使用以下属性完成“等待空闲”模型:
- 当一个方法
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 次。
我应该怎么做才能以一种高效而整洁的方式工作?(真的有那么难吗?)