栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

用Java实现去抖动

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

用Java实现去抖动

请考虑以下线程安全解决方案。请注意,锁定粒度是在密钥级别上的,因此仅同一密钥上的调用会相互阻塞。它还处理在调用call(K)时发生的密钥K过期的情况。

public class Debouncer <T> {  private final ScheduledExecutorService sched = Executors.newScheduledThreadPool(1);  private final ConcurrentHashMap<T, TimerTask> delayedMap = new ConcurrentHashMap<T, TimerTask>();  private final Callback<T> callback;  private final int interval;  public Debouncer(Callback<T> c, int interval) {     this.callback = c;    this.interval = interval;  }  public void call(T key) {    TimerTask task = new TimerTask(key);    TimerTask prev;    do {      prev = delayedMap.putIfAbsent(key, task);      if (prev == null)        sched.schedule(task, interval, TimeUnit.MILLISECONDS);    } while (prev != null && !prev.extend()); // Exit only if new task was added to map, or existing task was extended successfully  }  public void terminate() {    sched.shutdownNow();  }  // The task that wakes up when the wait time elapses  private class TimerTask implements Runnable {    private final T key;    private long dueTime;        private final Object lock = new Object();    public TimerTask(T key) {   this.key = key;      extend();    }    public boolean extend() {      synchronized (lock) {        if (dueTime < 0) // Task has been shutdown          return false;        dueTime = System.currentTimeMillis() + interval;        return true;      }    }    public void run() {      synchronized (lock) {        long remaining = dueTime - System.currentTimeMillis();        if (remaining > 0) { // Re-schedule task          sched.schedule(this, remaining, TimeUnit.MILLISECONDS);        } else { // Mark as terminated and invoke callback          dueTime = -1;          try { callback.call(key);          } finally { delayedMap.remove(key);          }        }      }    }    }


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/449827.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号