線程學習--(八)queue
阿新 • • 發佈:2017-06-14
高性能 數組 pre clas 並行 lin 性能 sync 緩沖
http://www.cnblogs.com/sigm/p/6186401.html
一、ConcurrentLinkedQueue
是一個適用於高並發場景下的隊列,通過無鎖的方式,實現了高並發狀態下的高性能,通常ConcurrentLinkedQueue性能好於BlockingQueue。它是一個基於鏈接節點的無界線程安全隊列。該隊列的元素遵循先進先出的原則。頭是最先加入的,尾是最近加入的,該隊列不予許null元素。
方法:add()和offer()都是加入元素的方法
poll和peek都是去頭元素的方法,區別在於前者會刪除元素,後者不會
ConcurrentLinkedQueue<String> q = newConcurrentLinkedQueue<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