美文网首页
JAVA队列ArrayBolcokQueue

JAVA队列ArrayBolcokQueue

作者: 在岁月中远行 | 来源:发表于2023-02-16 01:23 被阅读0次

    Queue的继承结构:

    Queue接口就定义了几个常用的方法,Queue接口没有定义阻塞队列方法,而是在BlockQueue中定义的,所有实现该接口的类我们可以认为是阻塞队列(注意阻塞队列不是一定阻塞的,只是提供了阻塞的方法,也有非阻塞的方法可以使用)。例如BlockQueue中的offer方法就是阻塞的,BlockQueue中的offer方法就是非阻塞的。

    队列通常以先进先出对元素进行排序,当然这是不一定的,也有优先级队列和后进先出。

    今天我们来分析下阻塞队列之一的ArrayBolcokQueue,阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队列里拿元素的线程。阻塞队列就是生产者存放元素的容器,而消费者也只能从容器里拿元素。

    ArrayBolckQueue源码分析:

    首先继承了AbstructQueue抽象类,然后再实现BlockQueue接口等。它是由数组支持的有界阻塞队列,这个队列对元素先进先出进行排序,容量一旦创建,就不能更改。

    实现我们来看构造方法:

    从构造方法来看,需要传入一个容量值,这个也就是后来内部数组的capacity值,默认是非公平锁。

    当构造方法第二个参数传入true时,就是一个公平队列,默认情况下不保证访问者公平的访问队列,所谓公平访问队列是指阻塞的所有生产者线程或消费者线程,当队列可用时,可以按照阻塞的先后顺序访问队列。 

    put方法:

    这里获得是一个可中断锁,可以看到当容量满时,notFull.await进行阻塞,插入数据会等待。否则的话就会调用enqueue方法入队列。

    这里获得是一个可中断锁,可以看到当容量空时,notFull.await进行阻塞,取出数据会等待。否则的话就会调用dequeue方法出队列。

    可以看到设定容量为4,在插入4的时候容量已经满了,5插入不进去,一直在等待。所以没有打印 已插入5这行代码。

    再来测试一下offer非阻塞,可以发现4和5之间没有等待,说明没有阻塞,当然5肯定也是因为容量问题插入失败的了。所有ArrayBlockQueue不只有阻塞还有非阻塞。

    offer(E e, long timeout, TimeUnit unit) 可以设定等待的时间,如果在指定的时间内,还不能往队列中加入BlockQueue,则返回false。

    poll(long timeout, TimeUnit unit) 从BlockQueue取出一个队首的对象,如果在指定时间内,队列一旦有数据可取,则立即返回队列中的数据,否则直到时间超时还没有数据可取时,返回Null。

    相关文章

      网友评论

          本文标题:JAVA队列ArrayBolcokQueue

          本文链接:https://www.haomeiwen.com/subject/qbwukdtx.html