ConcurrentLinkedQueue的簡單使用

農夫YH發表於2018-12-28

它是一個基於連結節點的無界執行緒安全佇列。該佇列的元素遵循先進先出的原則。頭是最先加入的,尾是最近加入的。插入元素是追加到尾上。提取一個元素是從頭提取。當多個執行緒共享訪問一個公共 collection 時,ConcurrentLinkedQueue 是一個恰當的選擇。該佇列不允許null元素

大致是這樣的思路,使用者請求介面 將使用者的請求方到 ConcurrentLinkedQueue 中去。然後按照順序一個一個 去處理使用者的請求
主要用到了 幾個方法

offer(E e)
將指定元素插入此佇列的尾部。

poll()
獲取並移除此佇列的頭,如果此佇列為空,則返回 null。

isEmpty()
如果此佇列不包含任何元素,則返回 true

新增和讀取元素的 方法不多說。 很簡單 , 完事是消費佇列裡的任務了

  @PostConstruct
    public void  consumer() throws InterruptedException {
        ExecutorService executor = Executors.newFixedThreadPool(1);
        executor.submit(new Runnable() {
            @Override
            public void run() {
                while (true){
                    try {
                        TimeUnit.SECONDS.sleep(2);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    while (!pullist.isEmpty()) {
                        Map<String, Object> map = (Map<String, Object>) pullist.poll();
                     
                        try{
                     	       /*這裡寫業務邏輯*/
                         
                        }catch (Exception e){
                            continue;
                        }
                    }
                }
            }
        });
    }


在controller 初始化的時候 開一個執行緒 ,去迴圈讀取佇列裡的訊息。 如果沒有訊息 就睡一會。
注意就是在判斷佇列是否為空的時候 不要使用.size 方法去獲取長度完事判斷是否為空。因為.size方法會遍歷整個佇列。 應該直接使用isEmpty 方法