/**
* 并发Queue
* 在并发队列上JDK提供了两套实现,
* 一个是ConcurrentLinKedQueue为代表的高性能队列
* 一个是BlockingQueue接口为代表的阻塞队列,无论哪种都继承自Queue
*/
public class ConcurrentQueueDemo {
}
package cn.bufanli.test.Queue;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;
/**
* ConcurrentLinKedQueue:是一个适用于高并发下的队列,通过无锁的方式,实现了高并发状态下的高性能,
* 通常ConcurrentLinKedQueue性能好过BlockingQueue.他是基于链接节点的无界线线程安全队列
* 改队列的元素遵循先进先出的原则,头是最先加入的,尾是最近加入的,该队列不允许null元素
* 重要方法:
* add()和offer()都是加入元素的方法(在ConcurrentLinKedQueue中,这俩方法没有任何区别)
* poll()和peek() 都是取头元素节点,区别在于前者会删除元素,后者不会.
*/
public class ConcurrentLinKedQueueDemo {
public static void main(String[] args) {
/* //高性能无阻塞无界队列:ConcurrentLinkedQueue
ConcurrentLinkedDeque<String> q = new ConcurrentLinkedDeque<>();
q.offer("a");
q.offer("b");
q.offer("c");
q.add("d");
System.out.println(q.poll());//a从头部取出并且删除
System.out.println(q.size());//3
System.out.println(q.peek());//b
System.out.println(q.size());//3*/
/*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");
//a 要塞入的值,3 等待时间 ,单位 3秒塞不进去就返回false
System.out.println(array.offer("a", 3, TimeUnit.SECONDS));*/
//阻塞队列
/*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);
// }
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(()->{
try {
System.out.println(q.take());
} catch (InterruptedException e) {
e.printStackTrace();
}
});
t1.start();
Thread t2 = new Thread(()->{
q.add("asdasd");
});
t2.start();
}
}