摘要:序雙向隊列是的一個子接口,雙向隊列是指該隊列兩端的元素既能入隊也能出隊。使用場景比如工作竊取,比如限流。限流實例使用來限流,其中為事件窗口,為該事件窗口的最大值。
序
雙向隊列(Deque),是Queue的一個子接口,雙向隊列是指該隊列兩端的元素既能入隊(offer)也能出隊(poll)。使用場景比如工作竊取,比如限流。
限流實例使用deque來限流,其中timeIntervalInMs為事件窗口,maxLimit為該事件窗口的最大值。
public class MyRateLimiter { private static final Logger LOGGER = LoggerFactory.getLogger(DemoRateLimiter.class); private final Dequequeue; private long timeIntervalInMs; public MyRateLimiter(long timeIntervalInMs, int maxLimit) { this.timeIntervalInMs = timeIntervalInMs; this.queue = new LinkedBlockingDeque (maxLimit); } public boolean incrAndReachLimit(){ long currentTimeMillis = System.currentTimeMillis(); boolean success = queue.offerFirst(currentTimeMillis); if(success){ //沒有超過maxLimit return false; } synchronized (this){ //queue is full long last = queue.getLast(); //還在時間窗口內,超過maxLimit if (currentTimeMillis - last < timeIntervalInMs) { return true; } LOGGER.info("time window expired,current:{},last:{}",currentTimeMillis,last); //超過時間窗口了,超過maxLimit的情況下,重置時間窗口 queue.removeLast(); queue.addFirst(currentTimeMillis); return false; } } }
測試
@Test public void testDeque() throws InterruptedException { DemoRateLimiter limiter = new DemoRateLimiter(5*1000,3); Callable小結test = new Callable (){ @Override public Void call() throws Exception { for(int i=0;i<1000;i++){ LOGGER.info("result:{}",limiter.incrAndReachLimit()); try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } } return null; } }; ExecutorService pool = Executors.newFixedThreadPool(10); pool.invokeAll(Arrays.asList(test,test,test,test,test)); Thread.sleep(100000); }
這里使用了Deque的容量來作為時間窗口的限流大小,利用兩端來判斷時間窗口,相對來講有點巧妙。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/70393.html
Deque接口 通常讀作deck,deque是雙端隊列,雙端隊列是元素的線性集合,支持在兩個端點處插入和移除元素,Deque接口是比Stack和Queue更豐富的抽象數據類型,因為它同時實現堆棧和隊列。Deque接口定義了訪問Deque實例兩端元素的方法,提供了插入、移除和檢查元素的方法,ArrayDeque和LinkedList等預定義類實現了Deque接口。 請注意,Deque接口既可以用作后...
摘要:它需要一個函數默認工廠作為其參數。默認情況下設置為,即如果鍵不存在則為,并返回并顯示默認值。因此,它是一個無序集合,其中元素及其各自的計數存儲為字典。這相當于其他語言的或。使用,我們不必使用整數索引來訪問元組的成員。 神奇的collections 大家好,今天想和大家分享一個Python里面非常棒的模快:Collections 該模塊實現了專門的容器數據類型,為Python的通用內置容...
摘要:會死循環,因為棧內不會彈出所以判斷會一直執行。集合用于模擬隊列這種數據結構,隊列通常是指先進先出的容器。集合不僅提供了的功能,還提供了雙端隊列,棧的功能。如果有多個線程需要訪問集合中的元素,需要考慮使用將幾個包裝成線程安全集合。 List判斷兩個對象相等只通過equals方法比較返回true即可。 public class A { @Override public ...
摘要:定場詩馬瘦毛長蹄子肥,兒子偷爹不算賊,瞎大爺娶個瞎大奶奶,老兩口過了多半輩,誰也沒看見誰前言本章為重讀學習數據結構與算法第三版的系列文章,主要講述隊列數據結構雙端隊列數據結構以及隊列相關應用。 定場詩 馬瘦毛長蹄子肥,兒子偷爹不算賊,瞎大爺娶個瞎大奶奶,老兩口過了多半輩,誰也沒看見誰! 前言 本章為重讀《學習JavaScript數據結構與算法-第三版》的系列文章,主要講述隊列數據結構、...
閱讀 2597·2021-10-14 09:43
閱讀 3559·2021-10-13 09:39
閱讀 3289·2019-08-30 15:44
閱讀 3137·2019-08-29 16:37
閱讀 3702·2019-08-29 13:17
閱讀 2731·2019-08-26 13:57
閱讀 1825·2019-08-26 11:59
閱讀 1238·2019-08-26 11:46