成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Deque的使用實例

jsummer / 2935人閱讀

摘要:序雙向隊列是的一個子接口,雙向隊列是指該隊列兩端的元素既能入隊也能出隊。使用場景比如工作竊取,比如限流。限流實例使用來限流,其中為事件窗口,為該事件窗口的最大值。

雙向隊列(Deque),是Queue的一個子接口,雙向隊列是指該隊列兩端的元素既能入隊(offer)也能出隊(poll)。使用場景比如工作竊取,比如限流。

限流實例

使用deque來限流,其中timeIntervalInMs為事件窗口,maxLimit為該事件窗口的最大值。

public class MyRateLimiter {

    private static final Logger LOGGER = LoggerFactory.getLogger(DemoRateLimiter.class);

    private final Deque queue;

    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();

            //還在時間窗口內(nèi),超過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);
    }
小結(jié)

這里使用了Deque的容量來作為時間窗口的限流大小,利用兩端來判斷時間窗口,相對來講有點巧妙。

文章版權歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/70393.html

相關文章

  • Java? 教程(Deque接口)

    Deque接口 通常讀作deck,deque是雙端隊列,雙端隊列是元素的線性集合,支持在兩個端點處插入和移除元素,Deque接口是比Stack和Queue更豐富的抽象數(shù)據(jù)類型,因為它同時實現(xiàn)堆棧和隊列。Deque接口定義了訪問Deque實例兩端元素的方法,提供了插入、移除和檢查元素的方法,ArrayDeque和LinkedList等預定義類實現(xiàn)了Deque接口。 請注意,Deque接口既可以用作后...

    lastSeries 評論0 收藏0
  • Python 進階之路 (七) 隱藏神奇寶藏:探秘Collections

    摘要:它需要一個函數(shù)默認工廠作為其參數(shù)。默認情況下設置為,即如果鍵不存在則為,并返回并顯示默認值。因此,它是一個無序集合,其中元素及其各自的計數(shù)存儲為字典。這相當于其他語言的或。使用,我們不必使用整數(shù)索引來訪問元組的成員。 神奇的collections 大家好,今天想和大家分享一個Python里面非常棒的??欤篊ollections 該模塊實現(xiàn)了專門的容器數(shù)據(jù)類型,為Python的通用內(nèi)置容...

    rickchen 評論0 收藏0
  • java集合-List

    摘要:會死循環(huán),因為棧內(nèi)不會彈出所以判斷會一直執(zhí)行。集合用于模擬隊列這種數(shù)據(jù)結(jié)構(gòu),隊列通常是指先進先出的容器。集合不僅提供了的功能,還提供了雙端隊列,棧的功能。如果有多個線程需要訪問集合中的元素,需要考慮使用將幾個包裝成線程安全集合。 List判斷兩個對象相等只通過equals方法比較返回true即可。 public class A { @Override public ...

    MasonEast 評論0 收藏0
  • 重讀《學習JavaScript數(shù)據(jù)結(jié)構(gòu)與算法-第三版》- 第5章 隊列

    摘要:定場詩馬瘦毛長蹄子肥,兒子偷爹不算賊,瞎大爺娶個瞎大奶奶,老兩口過了多半輩,誰也沒看見誰前言本章為重讀學習數(shù)據(jù)結(jié)構(gòu)與算法第三版的系列文章,主要講述隊列數(shù)據(jù)結(jié)構(gòu)雙端隊列數(shù)據(jù)結(jié)構(gòu)以及隊列相關應用。 定場詩 馬瘦毛長蹄子肥,兒子偷爹不算賊,瞎大爺娶個瞎大奶奶,老兩口過了多半輩,誰也沒看見誰! 前言 本章為重讀《學習JavaScript數(shù)據(jù)結(jié)構(gòu)與算法-第三版》的系列文章,主要講述隊列數(shù)據(jù)結(jié)構(gòu)、...

    charles_paul 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<