概述
目前在开发一个文档监控类工具时遇到一个问题 希望在文档编写过程中不对文档做备份 而在文档编写结束时再备份 这就需要一个防抖函数。
防抖函数 就是指触发事件后在n 秒内函数只能执行一次 如果在n 秒内又触发了事件 则会重新计算函数执行时间。 简单的说 当一个动作连续触发 则只执行最后一次。
实现我们可以使用ScheduledExecutorService的schedule方法实现
package net.wenzuo.util; import java.util.concurrent.*; * 抖动函数 * 以 相同 key 在 delay 时间内如果重复调用本方法将只会调用最后一次 * author 张豪 * since 2021/7/15 15:22 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); }
本文转自网络,原文链接:https://developer.aliyun.com/article/787305