栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

JAVA Queue总结(1)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

JAVA Queue总结(1)

在java中 Queue 继承至Collection 集合接口
queue表示队列 遵循先进先出的原则;
也就是放入队列中 先放入 获取的时候就先出来;

在Queue设计中每种方法基本有2个;
如下:
添加到队列 有add 和offer
add 如果容量允许将会返回true 否则抛出异常
offer成功返回true 失败返回false
从队列中移除 有remove poll
remove 获取并移除头部数据,当头部如果是空的将会抛出异常
poll 获取并移除头部数据 如果队列是空的 将会返回null
从队列中获取元素 element 和peek
element 不移除 并获取头部数据 但是队列为null 将会抛出异常
peek 不移除 并获取头部数据 队列null 返回null

总结下 :
add remove element 都会抛出异常
offer poll peek 不会抛出异常 只会为null;

下面我们看下Qeueue的子类

1.AbstractQueue 抽象队列

	该类封装队列大部分的基本操作
	如上面我们介绍的add/remove /element  会通过
	offer   poll/ peek 来实现  未添加成功/队列为null/队列为null/
	分别抛出异常
public boolean add(E e) {
        if (offer(e))
            return true;
        else
            throw new IllegalStateException("Queue full");
    }
    public E remove() {
        E x = poll();
        if (x != null)
            return x;
        else
            throw new NoSuchElementException();
    }
   public E element() {
        E x = peek();
        if (x != null)
            return x;
        else
            throw new NoSuchElementException();
    }

另外需要注意 clear方法和addAll
public void clear() { while (poll() != null) ; }
是通过pioll来循环实现的

  public boolean addAll(Collection c) {
        if (c == null)
            throw new NullPointerException();
        if (c == this)
            throw new IllegalArgumentException();
        boolean modified = false;
        for (E e : c)
            if (add(e))
                modified = true;
        return modified;
    }
注意 addall 方法 调用的是add(E e)
但是这里是不会因为add 抛出异常;

2 BlockingQueue阻塞队列 继承至 queue 所以 拥有queue的功能

BlockingQueue 拥有4中不同的操作形式
分别是 异常抛出/返回特定值   阻塞  和超时!

我们先看看 其带来的方法

	方法add:  容量不足时抛出异常    不会返回false    
	对应 不会抛出一样  返回false的 是offer
	
	相对于queue接口  新增put方法 并且会抛出interruptedExcetion

put方法:
put 放入元素 会抛出中断异常
如果我们的空间不够用 那么会一直阻塞到 空间够用 或者我们手动中断该线程
否则一直阻塞
offer方法:

    boolean offer(E e, long timeout, TimeUnit unit)
        throws InterruptedException;

在超时时,空间不够用将会抛出 中断异常

放入总结:
blockingQueue 执行添加操作再原来的queue基础上 新增put 会阻塞; 而 offer(…timepout)方法会在超时时抛出
offer(E e)不会;所以有四个方法执行放入

取出并移除
remove 抛出异常
take 同put 一直会阻塞 除非中断
poll 不会阻塞 会直接返回null
poll(timeoout) 会超时

另外阻塞队列 新增 remainingCpacity( 返回剩下可使用的容量
另外还提供了

int drainTo(Collection c);
  int drainTo(Collection c, int maxElements);

两个方法 都是将队列中的元素移除并添加到指定的集合中


Dequeue

dequeue 继承至queue

简称:双端队列

在上面我们提到的queue都是一侧进入 一侧出
而dequeue 可以两侧出 两侧入

方法:

 void addFirst(E e);

向前端添加一个元素 没有空间时抛出异常

注意 Deque 是一个线性的集合 因此可以是无线空间的 也可以是有限空间的

  void addLast(E e);

末端添加

同样会有offerFirst offerLast 在容量受限的情况下 是有区别的 否则是没有却别的

对于 remove… poll…
不做说明了
这里新增了 get… peek 都是获取 谴责 队列为null 抛出异常 厚泽 null

新增方法
removeFirst/lastOccurrence

移除指定元素

BlockingDequeue

基本上和blockingQueue一样 阻塞双端队列

TransferQueue
继承至 BlockingQueue

本质上可以理解为还是BlockingQueue
但是某种情况下 我们的生产者需要立即把元素退给我们的消费者

(有点类似强制我们买票 强制插队的味道)

来看看其方法:

boolean tryTransfer(E e);

尝试(插队)
如果成功插队被消费了 返回true
否则返回false 并且不会排队操作

void transfer(E e) throws InterruptedException;

强制去插队,并且等到(阻塞)消费者来消费你

hasWaitingConsumer

该方法表示 是否有等待中的消费者

getWaitingConsumerCount

获取等待消费者数量


以上基本就是我们的一些queue扩展抽象接口 下面将详细介绍每个子类

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/463295.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号