標籤:取出 ack ace 數組 inter queue 多個 空閑 blocking
Java中幾種常用的隊列
阻塞隊列與普通隊列的區別在於,當隊列是空的時,從隊列中擷取元素的操作將會被阻塞,或者當隊列是滿時,往隊列裡添加元素的操作會被阻塞。試圖從空的阻塞隊列中擷取元素的線程將會被阻塞,直到其他的線程往空的隊列插入新的元素。同樣,試圖往已滿的阻塞隊列中添加新元素的線程同樣也會被阻塞,直到其他的線程使隊列重新變得空閑起來,如從隊列中移除一個或者多個元素,或者完全清空隊列.
第一種:ConcurrentLinkedQueue,高效能無阻塞無界隊列
代碼demo:
1 ConcurrentLinkedQueue<String> q = new ConcurrentLinkedQueue<String>(); 2 q.offer("a"); 3 q.offer("b"); 4 q.offer("c"); 5 q.offer("d"); 6 q.add("e"); 7 8 System.out.println(q.poll()); //a 從頭部取出元素,並從隊列裡刪除 9 System.out.println(q.size()); //410 System.out.println(q.peek()); //b11 System.out.println(q.size()); //4
第二種:ArrayBlockingQueue,基於數組的阻塞隊列,有界隊列
1 ArrayBlockingQueue<String> array = new ArrayBlockingQueue<String>(5);2 array.put("a");3 array.put("b");4 array.add("c");5 array.add("d");6 array.add("e");7 //array.add("f");8 System.out.println(array.offer("a", 3, TimeUnit.SECONDS));
第三種:LinkedBlockingQueue,阻塞隊列,無屆隊列
1 LinkedBlockingQueue<String> q = new LinkedBlockingQueue<String>(); 2 q.offer("a"); 3 q.offer("b"); 4 q.offer("c"); 5 q.offer("d"); 6 q.offer("e"); 7 q.add("f"); 8 //System.out.println(q.size()); 9 10 // for (Iterator iterator = q.iterator(); iterator.hasNext();) {11 // String string = (String) iterator.next();12 // System.out.println(string);13 // }14 15 List<String> list = new ArrayList<String>();16 System.out.println(q.drainTo(list, 3));17 System.out.println(list.size());18 for (String string : list) {19 System.out.println(string);20 }
第四種:SynchronousQueue
1 final SynchronousQueue<String> q = new SynchronousQueue<String>(); 2 Thread t1 = new Thread(new Runnable() { 3 @Override 4 public void run() { 5 try { 6 System.out.println(q.take()); 7 } catch (InterruptedException e) { 8 e.printStackTrace(); 9 }10 }11 });12 t1.start();13 Thread t2 = new Thread(new Runnable() {14 15 @Override16 public void run() {17 q.add("asdasd");18 }19 });20 t2.start();
關於Java集合類庫中的幾種常用隊列