想实现一个逻辑:有一个方法A(),第一次调用等待500ms,如果在这个时间间隔内再次调用方法A(),则重新对方法A()进行计时,如果连续有多次调用方法A()且时间间隔均小于500ms,则只执行最后一个时间间隔大于500ms,也就是说只有与下一次调用超过500ms的调用才被执行。
本人才疏学浅,不知道是否java提供这样的方法,所以找起百度大神搜到的解答,有的说:sleep计算间隔,第一次睡500ms,如果第二次在第300ms内来了,再睡500-(500-300)=300ms,诶,听起来却是实现了,但是方法执行了多次,得不偿失啊,于是我构思不会连续执行多次的方式,因为在间隔小于500ms时不执行,禁止多任务
于是有了以下思路:新建一个Timer,方法A()中初始化,并让它500ms之后执行,每次调用方法A(),验证时间戳,如果时间间隔在500ms之内则把timer取消,再次调用方法A(),如果时间差大于500ms则直接滴啊用方法A(),执行任务。
模拟调用方法:
public void call() {
lastTime = System.currentTimeMillis();
final Timer timer = new Timer();
timer.schedule(new TimerTask() {
public void run() {
i++;
currentTime = System.currentTimeMillis();
if (currentTime - lastTime < 500) {
if (null != exec) {
exec.cancel();
exec();
}
} else {
exec();
}
lastTime = currentTime;
System.out.println("--调用任务--------" + System.currentTimeMillis());
if (i > 6) {
timer.cancel();
}
}
}, 600, delay);
}
执行任务方法:
public synchronized void exec() {
exec = new Timer();
exec.schedule(new TimerTask() {
public void run() {
System.out.println("---------任务执行--" + System.currentTimeMillis());
exec.cancel();
}
}, 500);
}
delay为400时:
delay为600时:
代码很简单,就不多介绍了。。。