java并发编程--并发队列

/**
 * 并发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();
    }
}

猜你喜欢

转载自blog.csdn.net/adminBfl/article/details/103267504