在java.util.concurrent包里有很多并发编程的常用工具类。
package com.ietree.basicskill.mutilthread.concurrent;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.concurrent.*;
/**
* Created by Root on 5/10/2017.
*/
public class UseQueue {
public static void main(String[] args) throws Exception {
/**
* 一个基于链接节点的无界线程安全队列,高性能无阻塞无界队列:ConcurrentLinkedQueue
* 此队列按照 FIFO(先进先出)原则对元素进行排序。队列的头部 是队列中时间最长的元素。队列的尾部 是队列中时间最短的元素。
* 新的元素插入到队列的尾部,队列获取操作从队列头部获得元素。
* 当多个线程共享访问一个公共 collection 时,ConcurrentLinkedQueue 是一个恰当的选择。此队列不允许使用 null 元素。
*
* 此实现采用了有效的“无等待 (wait-free)”算法.
* 需要小心的是,与大多数 collection 不同,size 方法不是 一个固定时间操作。由于这些队列的异步特性,确定当前元素的数量需要遍历这些元素。
* 内存一致性效果:当存在其他并发 collection 时,将对象放入 ConcurrentLinkedQueue 之前的线程中的操作 happen-before 随后通过另一线程从 ConcurrentLinkedQueue 访问或移除该元素的操作。
*/
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
System.out.println(q.size()); //4
/**
* 一个由数组支持的有界阻塞队列
* 这是一个典型的“有界缓存区”,固定大小的数组在其中保持生产者插入的元素和使用者提取的元素。
* 一旦创建了这样的缓存区,就不能再增加其容量。试图向已满队列中放入元素会导致操作受阻塞;试图从空队列中提取元素将导致类似阻塞。
* 此类支持对等待的生产者线程和使用者线程进行排序的可选公平策略。默认情况下,不保证是这种排序。
* 然而,通过将公平性 (fairness) 设置为 true 而构造的队列允许按照 FIFO 顺序访问线程。公平性通常会降低吞吐量,但也减少了可变性和避免了“不平衡性”。
*/
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));
/**
* 一个基于已链接节点的、范围任意的 blocking queue。阻塞队列
* 链接队列的吞吐量通常要高于基于数组的队列,但是在大多数并发应用程序中,其可预知的性能要低。
* 可选的容量范围构造方法参数作为防止队列过度扩展的一种方法。如果未指定容量,
* 则它等于 Integer.MAX_VALUE。除非插入节点会使队列超出容量,否则每次插入后会动态地创建链接节点。
*/
LinkedBlockingQueue<String> lbq = new LinkedBlockingQueue<String>();
lbq.offer("a");
lbq.offer("b");
lbq.offer("c");
lbq.offer("d");
lbq.offer("e");
lbq.add("f");
List<String> list = new ArrayList<String>();
// 最多从此队列中移除给定数量的可用元素,并将这些元素添加到给定 collection 中。
System.out.println(lbq.drainTo(list, 3));
//System.out.println(q.size());