概述
目前在开发一个文档监控类工具时遇到一个问题,希望在文档编写过程中不对文档做备份,而在文档编写结束时再备份,这就需要一个防抖函数。
防抖函数,就是指触发事件后在n 秒内函数只能执行一次,如果在n 秒内又触发了事件,则会重新计算函数执行时间。 简单的说,当一个动作连续触发,则只执行最后一次。
实现
我们可以使用ScheduledExecutorService的schedule方法实现
packagenet.wenzuo.util; importjava.util.concurrent.*; /*** 抖动函数* 以 相同 key 在 delay 时间内如果重复调用本方法将只会调用最后一次** @author 张豪* @since 2021/7/15 15:22*/publicclassDebounce { privatestaticfinalScheduledExecutorServiceSCHEDULE=Executors.newSingleThreadScheduledExecutor(); privatestaticfinalConcurrentHashMap<Object, Future<?>>DELAYED_MAP=newConcurrentHashMap<>(); publicstaticvoiddebounce(finalObjectkey, finalRunnablerunnable, longdelay, TimeUnitunit) { finalFuture<?>prev=DELAYED_MAP.put(key, SCHEDULE.schedule(() -> { try { runnable.run(); } finally { DELAYED_MAP.remove(key); } }, delay, unit)); if (prev!=null) { prev.cancel(true); } } publicstaticvoidshutdown() { SCHEDULE.shutdownNow(); } publicstaticvoidmain(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); } }