非阻塞队列 和 阻塞队列

        阻塞队列与普通队列的区别在于,当队列是空的时,从队列中获取元素的操做将会被阻塞,或者当队列是满时,往队列里添加元素的操做会被阻塞。试图从空的阻塞队列中获取元素的线程将会被阻塞,直到其余的线程往空的队列插入新的元素。一样,试图往已满的阻塞队列中添加新元素的线程一样也会被阻塞,直到其余的线程使队列从新变得空闲起来,如从队列中移除一个或者多个元素,或者彻底清空队列.spa

                使用非阻塞队列的时候有一个很大问题就是  : 它不会对当前线程产生阻塞,那么在面对相似消费者-生产者的模型时,就必须额外地实现同步策略以及线程间唤醒策略,这个实现起来就很是麻烦。可是有了阻塞队列就不同了,它会对当前线程产生阻塞,好比一个线程从一个空的阻塞队列中取元素,此时线程会被阻塞直到阻塞队列中有了元素。当队列中有元素后,被阻塞的线程会自动被唤醒(不须要咱们编写代码去唤醒)。这样提供了极大的方便性线程

    

1.非阻塞队列中的几个主要方法:orm

  •   add(E e):将元素e插入到队列末尾,若是插入成功,则返回true;若是插入失败(即队列已满),则会抛出异常;队列

  •   remove():移除队首元素,若移除成功,则返回true;若是移除失败(队列为空),则会抛出异常;rem

  •   offer(E e):将元素e插入到队列末尾,若是插入成功,则返回true;若是插入失败(即队列已满),则返回false;同步

  •   poll():移除并获取队首元素,若成功,则返回队首元素;不然返回null;it

  •   peek():获取队首元素,若成功,则返回队首元素;不然返回null方法

 

  对于非阻塞队列,通常状况下建议使用offer、poll和peek三个方法,不建议使用add和remove方法。由于使用offer、poll和peek三个方法能够经过返回值判断操做成功与否,而使用add和remove方法却不能达到这样的效果。注意,非阻塞队列中的方法都没有进行同步措施。im

2.阻塞队列中的几个主要方法:异常

  阻塞队列包括了非阻塞队列中的大部分方法,上面列举的5个方法在阻塞队列中都存在,可是要注意这5个方法在阻塞队列中都进行了同步措施。除此以外,阻塞队列提供了另外4个很是有用的方法:

  1.   put(E e)

  2.   take()

  3.   offer(E e,long timeout, TimeUnit unit)

  4.   poll(long timeout, TimeUnit unit)

  

  •   put方法用来向队尾存入元素,若是队列满,则等待;

  •   take方法用来从队首取元素,若是队列为空,则等待;

  •   offer方法用来向队尾存入元素,若是队列满,则等待必定的时间,当时间期限达到时,若是尚未插入成功,则返回false;不然返回true;

  •   poll方法用来从队首取元素,若是队列空,则等待必定的时间,当时间期限达到时,若是取到,则返回null;不然返回取得的元素;

相关文章
相关标签/搜索