package com.bjsxt.base.coll013;
import java.util.concurrent.SynchronousQueue;
/**
ConcurrentLinkedQueue : 先進先出高併發隊列。無鎖、無阻塞。不允許null元素。
先進在頭,後進在尾。
方法 :add( )、 offer() 、Poll()從頭部取出元素,並刪除、
peek()從頭部取出元素,不刪除。
BlockingQueue 接口: 阻塞隊列
ArrayBlockingQueue : 不支持併發,低效。有長度限制,並且阻塞,無讀寫分離(意味着生產和消費不能同時進行)
LinkedBlockingQueue : 支持併發操作,高效。基於鏈表的阻塞隊列,高效的處理併發數據,無長度限制,內部實現讀寫分離鎖,
從而實現生產者和消費者操作完全並行運行。
SynchronousQueue : 一種沒有緩衝的隊列,生成一個消費一個,沒有第二個了。
*
*/
public class UseQueue {
public static void main(String[] args) throws Exception {
//高性能無阻塞無界隊列:ConcurrentLinkedQueue
//先進先出高併發隊列。無鎖、無阻塞。不允許null元素。
/* 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 不移除,一下次peek 依然是這個b
System.out.println(q.size()); //4
*/
/*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));*///等待3秒,如果加入不成功就拋異常。
//阻塞隊列
//支持併發操作,高效。基於鏈表的阻塞隊列,高效的處理併發數據,無長度限制,內部實現讀寫分離鎖,
//從而實現生產者和消費者操作完全並行運行。
/* 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);
}
System.out.println("---------------------------------");
List<String> list = new ArrayList<String>();
System.out.println(q.drainTo(list, 3));
System.out.println(list.size());
for (String string : list) {
System.out.println(string);
}*/
final SynchronousQueue<String> q = new SynchronousQueue<String>();
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
try {
System.out.println(q.take());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
t1.start();
Thread.sleep(100);
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
try {
q.put("ddd");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
t2.start();
}
}