LinkedBlockingDeque介绍

发布时间 2023-04-05 21:52:34作者: 余生请多指教ANT
//        有一个内部类 final class Node<E> ,
//        用于包装每个节点的数据。另外有成员属性
//        Node<E> first,Node<E> last,
//        当前拥有元素数量int count ,容量 int capacity;
//        E item 当前节点数据
//        Node<E> prev  指向当前节点前驱节点的地址
//        Node<E> next  指向当前节点下个节点的地址

//        LinkedBlockingDeque 是基于链表的双端阻塞队列,线程安全,元素不允许为 null。
//
//        空间容量最大一般为Integer.MAX_VALUE,如果构造器中指定了最大值则队列长度将会被限制在该值以下。
//
//        大部分方法都以固定时间运行,批量操作,例如:remove, removeFirstOccurrence,removeLastOccurrence,contains,iterator.remove(),将以线性时间运行。
//
//        LinkedBlockingDeque 是阻塞队列,是指对于一些指定的操作,在插入或者获取队列元素时如果队列状态不允许该操作可能会阻塞住该线程直到队列状态变更为允许操作,这里的阻塞一般有两种情况。
//
//        第一种是插入元素时,如果当前队列已满将会进入阻塞状态,一直等到队列有空的位置时再讲该元素插入,该操作可以通过设置超时参数,超时后返回 false 表示操作失败,也可以不设置超时参数一直阻塞,中断后抛出InterruptedException异常。
//
//        第二种是读取元素时如果当前队列为空会阻塞住直到队列不为空然后返回元素,同样可以通过设置超时参数。
        /**
         *      Number of items in the deque  队列内元素数量
         *      private transient int count;
         *
         *      Maximum number of items in the deque 队列内最大容量
         *      private final int capacity;
         *
         *     Main lock guarding all access   全局锁
         *     final ReentrantLock lock = new ReentrantLock();
         *
         *      Condition for waiting takes   取锁
         *     private final Condition notEmpty = lock.newCondition();
         *
         *     Condition for waiting puts   存锁
         *     private final Condition notFull = lock.newCondition();
         */
        LinkedBlockingDeque linkedBlockingDeque = new LinkedBlockingDeque();
        //初始化容量的队列
//        LinkedBlockingDeque linkedBlockingDeque = new LinkedBlockingDeque(10);
        //初始化集合的队列  集合元素不可为空
//        LinkedBlockingDeque linkedBlockingDeque = new LinkedBlockingDeque(new ArrayList());

        //添加添加添加添加添加添加添加添加
        //添加添加添加添加添加添加添加添加
        // 添加添加添加添加添加添加添加添加
        //添加添加添加添加添加添加添加添加
        //放入队列后面 元素为空或者队列满了,抛出异常
        linkedBlockingDeque.add();
        //存入一个集合到队列,元素不可为空否则抛出异常,把自己添加进来也抛入异常
        linkedBlockingDeque.addAll();
        //非阻塞放入队列的第一个位置,满了抛出异常
        linkedBlockingDeque.addFirst();
        //非阻塞放入队列的最后一个位置,满了抛出异常
        linkedBlockingDeque.addLast();


        //从队头写入元素,如果队列已满,抛出异常IllegalStateException("Deque full")
        linkedBlockingDeque.push();
        //向队首阻塞式插入元素,如果队列未满则插入,如果队列已满,
        // 则阻塞当前线程直到队列为空闲,或者元素被其他线程取出。
        // 如果线程在阻塞时被其他线程设置了中断标志,则抛出InterruptedException异常并返回
        linkedBlockingDeque.putFirst(1);

       //写入元素至队尾,成功返回true, 如果队列已满,返回false, e的值不能为空,否则抛出NullPointerException。
        linkedBlockingDeque.offer();
        //限时阻塞队首入队,成功返回true,队列已满返回,超时未写入返回false,元素为null,抛出NullPointerException
        linkedBlockingDeque.offer(1, 3,TimeUnit.SECONDS );
        //非阻塞式队尾入队  满的话返回true 反之为false
        linkedBlockingDeque.offerFirst(1);
        //可响应中断限时阻塞队首入队
        linkedBlockingDeque.offerFirst(1,3,TimeUnit.SECONDS);

        //可响应中断限时阻塞队尾入队 未满返回true 满了就返回false
        linkedBlockingDeque.offerLast(1);

        //向队尾插入元素,如果队列未满则插入返回true,如果队列已满,则阻塞指定时间,如果超时未写入就返回false
        linkedBlockingDeque.offerLast(1,2,TimeUnit.SECONDS);



        //取取取取取取取取取取取取取取
        //取取取取取取取取取取取取取取
        //取取取取取取取取取取取取取取
        //取取取取取取取取取取取取取取
        //查找不移除
        linkedBlockingDeque.peek();
        //查找不移除 查找队列第一个元素,有的话返回,没有返回null
        linkedBlockingDeque.peekFirst();
        //查找不移除 查找队列最后一个元素,有的话返回,没有返回null
        linkedBlockingDeque.peekLast();

        //底层调用takeFirst(),取出元素并移除,为空则阻塞
        linkedBlockingDeque.take();
        //取出第一个元素并移除,为空则阻塞
        linkedBlockingDeque.takeFirst();
        //取出最后一个元素并移除,为空则阻塞
        linkedBlockingDeque.takeLast();
        //清除队列的元素置为null
        linkedBlockingDeque.clear();


        //把队列中的元素放入集合中    原队列元素不移除
        linkedBlockingDeque.drainTo(new ArrayList());

        //把指定数量的队列中的元素放入集合中     原队列元素不移除
        linkedBlockingDeque.drainTo(new ArrayList(),3);
        //判断队列是否存在某元素
        linkedBlockingDeque.contains();
        //判断队列是否存在集合中的元素
        linkedBlockingDeque.containsAll();


        //移除移除移除移除移除移除移除移除
        //移除移除移除移除移除移除移除移除
        //移除移除移除移除移除移除移除移除
        //移除移除移除移除移除移除移除移除
        //非阻塞移除第一个元素,没有就返回空
        linkedBlockingDeque.poll();
        //规定时间阻塞移除第一个元素,超时返回null
        linkedBlockingDeque.poll(3,TimeUnit.SECONDS);
        //非阻塞移除第一个元素,没有就返回空
        linkedBlockingDeque.pollFirst();
        //规定时间阻塞移除第一个元素,超时返回null
        linkedBlockingDeque.pollFirst(1,TimeUnit.SECONDS);

        //非阻塞移除最后一个元素,没有返回null,不然返回值
        linkedBlockingDeque.pollLast();
        //限时阻塞移除最后一个元素,超时返回null,不然返回值
        linkedBlockingDeque.pollLast(3, TimeUnit.SECONDS);



        //移除第一个元素,队列不可为空,为空抛出异常
        linkedBlockingDeque.remove();
        //从队首至队尾遍历(从前往后),移除通过equals判断相等的第一个元素,并返回true
        linkedBlockingDeque.remove(1);
        //此方法返回可以插入双端队列容器的剩余元素数
        linkedBlockingDeque.remainingCapacity();
        //移除第一个元素,队列不可为null
        linkedBlockingDeque.removeFirst();
        //非阻塞移除最后一个元素,不可为null
        linkedBlockingDeque.removeLast();
        //移除队列中首次出现的某个元素
        linkedBlockingDeque.removeFirstOccurrence();
        //方法从此双端队列删除最后一次出现的指定元素。如果双端队列不包含元素,则它将保持不变。如果此双端队列包含指定的元素,则返回true,否则返回false。
        linkedBlockingDeque.removeLastOccurrence();
        //从队列中移除集合中的元素,集合中的元素不可为null
        linkedBlockingDeque.removeAll();
        //移除双队列中满足条件的元素
        linkedBlockingDeque.removeIf();