1. 程式人生 > >線程學習--(八)queue

線程學習--(八)queue

高性能 數組 pre clas 並行 lin 性能 sync 緩沖

http://www.cnblogs.com/sigm/p/6186401.html

一、ConcurrentLinkedQueue

是一個適用於高並發場景下的隊列,通過無鎖的方式,實現了高並發狀態下的高性能,通常ConcurrentLinkedQueue性能好於BlockingQueue。它是一個基於鏈接節點的無界線程安全隊列。該隊列的元素遵循先進先出的原則。頭是最先加入的,尾是最近加入的,該隊列不予許null元素。

方法:add()和offer()都是加入元素的方法

   poll和peek都是去頭元素的方法,區別在於前者會刪除元素,後者不會

ConcurrentLinkedQueue<String> q = new
ConcurrentLinkedQueue<String>(); q.offer("a"); q.offer("b"); q.offer("c"); q.offer("d"); q.add("e"); System.out.println(q.poll()); //a 從頭部取出元素,並從隊列裏刪除 System.out.println(q.size()); //4 System.out.println(q.peek()); //
b System.out.println(q.size()); //4

二、BlockingQueue接口

ArrayBlockingQueue:基於數組的阻塞隊列實現,在ArrayBlockingQueue內部,維護了一個定長數組,以便緩存隊列中的數據對象,其內部沒有實現讀寫分離,長度需要定義

ArrayBlockingQueue<String> array = new ArrayBlockingQueue<String>(5);
        array.put("a");
        array.put("b");
        array.add(
"c"); array.add("d"); array.add("e"); array.add("f"); //System.out.println(array.offer("a", 3, TimeUnit.SECONDS));

LinkedBlockingQueue:基於鏈表的阻塞隊列,其內部也維持著一個數據緩沖隊列(一個鏈表構成),之所以能夠高效的處理並發數據,因為內部實現了分離鎖(讀寫分離兩個鎖),從而實現生產者和消費者操作的完全並行運行,是一個無界隊列。

LinkedBlockingQueue<String> q = new LinkedBlockingQueue<String>();
        q.offer("a");
        q.offer("b");
        q.offer("c");
        q.offer("d");
        q.offer("e");
        q.add("f");
        //System.out.println(q.size());
        
        for (Iterator iterator = q.iterator(); iterator.hasNext();) {
            String string = (String) iterator.next();
            System.out.println(string);
        }

SynchronousQueue:一種沒有緩沖的隊列,生產者產生的數據直接會被消費者獲取並消費

PriorityBlockingQueue:

DelayQueue:

線程學習--(八)queue