亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

Deque的使用實例

jsummer / 2956人閱讀

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

雙向隊列(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的容量來作為時間窗口的限流大小,利用兩端來判斷時間窗口,相對來講有點巧妙。

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

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

相關(guān)文章

  • Java? 教程(Deque接口)

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

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

    摘要:它需要一個函數(shù)默認(rèn)工廠作為其參數(shù)。默認(rèn)情況下設(shè)置為,即如果鍵不存在則為,并返回并顯示默認(rèn)值。因此,它是一個無序集合,其中元素及其各自的計數(shù)存儲為字典。這相當(dāng)于其他語言的或。使用,我們不必使用整數(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),隊列通常是指先進(jìn)先出的容器。集合不僅提供了的功能,還提供了雙端隊列,棧的功能。如果有多個線程需要訪問集合中的元素,需要考慮使用將幾個包裝成線程安全集合。 List判斷兩個對象相等只通過equals方法比較返回true即可。 public class A { @Override public ...

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

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

    charles_paul 評論0 收藏0

發(fā)表評論

0條評論

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