Java多线程之阻塞队列

2016-09-16  本文已影响0人  cp_insist

一基本概念:
1:什么叫阻塞队列
阻塞队列都是相对于非阻塞队列而言的,非阻塞队列就是队列不会对当前线程产生阻塞;例如当一个队列中元素已经存储满时,非阻塞队列就会抛异常此项操作也就失败了,但是阻塞队列则不同,它会等待直到队列中有空位置之后继续进行此操作;、
但是当非阻塞队列遇到生产消费者模型时,就必须要使用同步策略和线程间的通信策略;这个方式实现的过程比较麻烦;但是阻塞队列则不同,当队列中已经满时他会阻塞会等待直到队列中有空位置之后自动唤醒继续进行此操作;显然阻塞队列实现此模型要简单和方便很多;
2:阻塞队列的主要形式:
<1>:ArrayBlockQuene:基于数组实现的一个阻塞队列,在创建ArrayBlockingQueue对象时必须制定容量大小。并且可以指定公平性与非公平性,默认情况下为非公平的,即不保证等待时间最长的队列最优先能够访问队列。
<2>:LinkedBlockingQueue:基于链表实现的一个阻塞队列,在创建LinkedBlockingQueue对象时如果不指定容量大小,则默认大小为Integer.MAX_VALUE。
<3>:PriorityBlockingQueue:以上2种队列都是先进先出队列,而PriorityBlockingQueue却不是,它会按照元素的优先级对元素进行排序,按照优先级顺序出队,每次出队的元素都是优先级最高的元素。注意,此阻塞队列为无界阻塞队列,即容量没有上限(通过源码就可以知道,它没有容器满的信号标志),前面2种都是有界队列。
<4>:DelayQueue:基于PriorityQueue,一种延时阻塞队列,DelayQueue中的元素只有当其指定的延迟时间到了,才能够从队列中获取到该元素。DelayQueue也是一个无界队列,因此往队列中插入数据的操作(生产者)永远不会被阻塞,而只有获取数据的操作(消费者)才会被阻塞。
3:常用方法:
阻塞队列包括了非阻塞队列中的大部分方法,上面列举的5个方法在阻塞队列中都存在,但是要注意这5个方法在阻塞队列中都进行了同步措施。除此之外,阻塞队列提供了另外4个非常有用的方法:
  put(E e)
  take()
  offer(E e,long timeout, TimeUnit unit)
  poll(long timeout, TimeUnit unit)

  put方法用来向队尾存入元素,如果队列满,则等待;
  take方法用来从队首取元素,如果队列为空,则等待;
  offer方法用来向队尾存入元素,如果队列满,则等待一定的时间,当时间期限达到时,如果还没有插入成功,则返回false;否则返回true;
  poll方法用来从队首取元素,如果队列空,则等待一定的时间,当时间期限达到时,如果取到,则返回null;否则返回取得的元素;
4:足赛队列的方法分类:
阻塞队列方法分为以下3类:取决队列满时他们的响应方式;
<1>:如果将队列当作管理工具来用:将要用到put和take方法;
<2>:当试图向满的队列中添加或从空的队列中移出元素时,add,remove,和element操作会抛出异常;
<3>:一个多线程程序中,队列会在任何时候空或者满,因此一定要使用offer,poll和peek方法作为代替;这些方法如果不能完成任务,只能给出一个错误提示而不会抛出异常;

上一篇下一篇

猜你喜欢

热点阅读