1. 程式人生 > >關於Java集合類庫中的幾種常用隊列

關於Java集合類庫中的幾種常用隊列

rac syn text 刪除 style asdasd 新元素 其他 arraylist

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()); //4 10 System.out.println(q.peek()); //b 11 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             @Override
16             public void run() {
17                 q.add("asdasd");
18             }
19         });
20         t2.start();

關於Java集合類庫中的幾種常用隊列