简介: 防抖函数,就是指触发事件后在n 秒内函数只能执行一次,如果在n 秒内又触发了事件,则会重新计算函数执行时间。 简单的说,当一个动作连续触发,则只执行最后一次。
概述
防抖函数,就是指触发事件后在n 秒内函数只能执行一次,如果在n 秒内又触发了事件,则会重新计算函数执行时间。 简单的说,当一个动作连续触发,则只执行最后一次。
实现
import java.util.concurrent.*;
/**
* 抖动函数
* 以 相同 key 在 delay 时间内如果重复调用本方法将只会调用最后一次
*/
public class Debounce {
private static final ScheduledExecutorService SCHEDULE = Executors.newSingleThreadScheduledExecutor();
private static final ConcurrentHashMap<Object, Future<?>> DELAYED_MAP = new ConcurrentHashMap<>();
public static void debounce(final Object key, final Runnable runnable, long delay, TimeUnit unit) {
final Future<?> prev = DELAYED_MAP.put(key, SCHEDULE.schedule(() -> {
try {
runnable.run();
} finally {
DELAYED_MAP.remove(key);
}
}, delay, unit));
if (prev != null) {
prev.cancel(true);
}
}
public static void shutdown() {
SCHEDULE.shutdownNow();
}
public static void main(String[] args) {
Debounce.debounce("1", () -> {System.out.println(11);}, 3, TimeUnit.SECONDS);
Debounce.debounce("1", () -> {System.out.println(22);}, 3, TimeUnit.SECONDS);
Debounce.debounce("1", () -> {System.out.println(33);}, 3, TimeUnit.SECONDS);
Debounce.debounce("2", () -> {System.out.println(44);}, 3, TimeUnit.SECONDS);
Debounce.debounce("2", () -> {System.out.println(44);}, 3, TimeUnit.SECONDS);
Debounce.debounce("2", () -> {System.out.println(44);}, 3, TimeUnit.SECONDS);
}
}