初学者java入门基础知识 java双端队列原理( 二 )

2)LinkedBlockingQueueLinkedBlockingQueue 是一个由链表实现的有界阻塞队列 , 容量默认值为 Integer.MAX_VALUE , 也可以自定义容量 , 建议指定容量大小 , 默认大小在添加速度大于删除速度情况下有造成内存溢出的风险 , LinkedBlockingQueue 是先进先出的方式存储元素 。
3)ArrayBlockingQueueArrayBlockingQueue 是一个有边界的阻塞队列 , 它的内部实现是一个数组 。它的容量是有限的 , 我们必须在其初始化的时候指定它的容量大小 , 容量大小一旦指定就不可改变 。ArrayBlockingQueue 也是先进先出的方式存储数据 , ArrayBlockingQueue 内部的阻塞队列是通过重入锁 ReenterLock 和 Condition 条件队列实现的 , 因此 ArrayBlockingQueue 中的元素存在公平访问与非公平访问的区别 , 对于公平访问队列 , 被阻塞的线程可以按照阻塞的先后顺序访问队列 , 即先阻塞的线程先访问队列 。而非公平队列 , 当队列可用时 , 阻塞的线程将进入争夺访问资源的竞争中 , 也就是说谁先抢到谁就执行 , 没有固定的先后顺序 。示例代码如下:
【初学者java入门基础知识 java双端队列原理】// 默认非公平阻塞队列ArrayBlockingQueue queue = new ArrayBlockingQueue(6);// 公平阻塞队列ArrayBlockingQueue queue2 = new ArrayBlockingQueue(6,true);// ArrayBlockingQueue 源码展示public ArrayBlockingQueue(int capacity) {this(capacity, false);}public ArrayBlockingQueue(int capacity, boolean fair) {if (capacity <= 0)throw new IllegalArgumentException();this.items = new Object[capacity];lock = new ReentrantLock(fair);notEmpty = lock.newCondition();notFull =lock.newCondition();}4)DelayQueueDelayQueue 是一个支持延时获取元素的无界阻塞队列 , 队列中的元素必须实现 Delayed 接口 , 在创建元素时可以指定延迟时间 , 只有到达了延迟的时间之后 , 才能获取到该元素 。实现了 Delayed 接口必须重写两个方法  , getDelay(TimeUnit) 和 compareTo(Delayed) , 如下代码所示:
class DelayElement implements Delayed {@Override// 获取剩余时间public long getDelay(TimeUnit unit) {// do something}@Override// 队列里元素的排序依据public int compareTo(Delayed o) {// do something}}DelayQueue 使用的完整示例 , 请参考以下代码:
public class DelayTest {public static void main(String[] args) throws InterruptedException {DelayQueue delayQueue = new DelayQueue();delayQueue.put(new DelayElement(1000));delayQueue.put(new DelayElement(3000));delayQueue.put(new DelayElement(5000));System.out.println("开始时间:" +DateFormat.getDateTimeInstance().format(new Date()));while (!delayQueue.isEmpty()){System.out.println(delayQueue.take());}System.out.println("结束时间:" +DateFormat.getDateTimeInstance().format(new Date()));} static class DelayElement implements Delayed {// 延迟截止时间(单面:毫秒)long delayTime = System.currentTimeMillis(); public DelayElement(long delayTime) {this.delayTime = (this.delayTime + delayTime); } @Override// 获取剩余时间 public long getDelay(TimeUnit unit) {return unit.convert(delayTime - System.currentTimeMillis(), TimeUnit.MILLISECONDS); } @Override// 队列里元素的排序依据 public int compareTo(Delayed o) {if (this.getDelay(TimeUnit.MILLISECONDS) > o.getDelay(TimeUnit.MILLISECONDS)) {return 1;} else if (this.getDelay(TimeUnit.MILLISECONDS) < o.getDelay(TimeUnit.MILLISECONDS)) {return -1;} else {return 0;}}@Overridepublic String toString() {return DateFormat.getDateTimeInstance().format(new Date(delayTime)); } }}程序执行结果:

开始时间:2019-6-13 20:40:38 2019-6-13 20:40:39 2019-6-13 20:40:41 2019-6-13 20:40:43 结束时间:2019-6-13 20:40:43

推荐阅读