Java并发编程:堵塞行列ITeye - 千亿集团

Java并发编程:堵塞行列ITeye

2019-01-12 09:24:48 | 作者: 鸿熙 | 标签: 行列,堵塞,办法 | 浏览: 2288

在前面几篇文章中,咱们评论了同步容器(Hashtable、Vector),也评论了并发容器(ConcurrentHashMap、CopyOnWriteArrayList),这些东西都为咱们编写多线程程序供给了很大的便利。今日咱们来评论别的一类容器:堵塞行列。

在前面咱们触摸的行列都对错堵塞行列,比方PriorityQueue、LinkedList(LinkedList是双向链表,它完成了Dequeue接口)。

运用非堵塞行列的时分有一个很大问题便是:它不会对其时线程发生堵塞,那么在面临相似顾客-生产者的模型时,就有必要额外地完成同步战略以及线程间唤醒战略,这个完成起来就十分费事。可是有了堵塞行列就不相同了,它会对其时线程发生堵塞,比方一个线程从一个空的堵塞行列中取元素,此刻线程会被堵塞直到堵塞行列中有了元素。当行列中有元素后,被堵塞的线程会主动被唤醒(不需要咱们编写代码去唤醒)。这样供给了极大的便利性。

本文先叙述一下java.util.concurrent包下供给首要的几种堵塞行列,然后剖析了堵塞行列和非堵塞行列的中的各个办法,接着剖析了堵塞行列的完成原理,最终给出了一个实践比如和几个运用场景。

一.几种首要的堵塞行列

二.堵塞行列中的办法 VS 非堵塞行列中的办法

三.堵塞行列的完成原理

四.示例和运用场景

若有不正之处请多多体谅,并欢迎批评指正。

请尊重作者劳动成果,转载请标明原文链接:

  http://www.cnblogs.com/dolphin0520/p/3932906.html

一.几种首要的堵塞行列

自从Java 1.5之后,在java.util.concurrent包下供给了若干个堵塞行列,首要有以下几个:

ArrayBlockingQueue:根据数组完成的一个堵塞行列,在创立ArrayBlockingQueue目标时有必要拟定容量巨细。而且能够指定公正性与非公正性,默许状况下为非公正的,即不确保等候时刻最长的行列最优先能够拜访行列。

LinkedBlockingQueue:根据链表完成的一个堵塞行列,在创立LinkedBlockingQueue目标时假如不指定容量巨细,则默许巨细为Integer.MAX_VALUE。

PriorityBlockingQueue:以上2种行列都是先进先出行列,而PriorityBlockingQueue却不是,它会依照元素的优先级对元素进行排序,依照优先级次序出队,每次出队的元素都是优先级最高的元素。留意,此堵塞行列为无界堵塞行列,即容量没有上限(经过源码就能够知道,它没有容器满的信号标志),前面2种都是有界行列。

DelayQueue:根据PriorityQueue,一种延时堵塞行列,DelayQueue中的元素只要当其指定的延迟时刻到了,才能够从行列中获取到该元素。DelayQueue也是一个无界行列,因而往行列中刺进数据的操作(生产者)永久不会被堵塞,而只要获取数据的操作(顾客)才会被堵塞。

二.堵塞行列中的办法 VS 非堵塞行列中的办法

1.非堵塞行列中的几个首要办法:

add(E e):将元素e刺进到行列结尾,假如刺进成功,则回来true;假如刺进失利(即行列已满),则会抛出反常;

remove():移除队首元素,若移除成功,则回来true;假如移除失利(行列为空),则会抛出反常;

offer(E e):将元素e刺进到行列结尾,假如刺进成功,则回来true;假如刺进失利(即行列已满),则回来false;

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

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

 

关于非堵塞行列,一般状况下主张运用offer、poll和peek三个办法,不主张运用add和remove办法。由于运用offer、poll和peek三个办法能够经过回来值判别操作成功与否,而运用add和remove办法却不能到达这样的作用。留意,非堵塞行列中的办法都没有进行同步办法。

2.堵塞行列中的几个首要办法:

堵塞行列包含了非堵塞行列中的大部分办法,上面罗列的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;不然回来获得的元素;

三.堵塞行列的完成原理

前面谈到了非堵塞行列和堵塞行列中常用的办法,下面来讨论堵塞行列的完成原理,本文以ArrayBlockingQueue为例,其他堵塞行列完成原理或许和ArrayBlockingQueue有一些不同,可是大体思路应该相似,有爱好的朋友可自行检查其他堵塞行列的完成源码。

首要看一下ArrayBlockingQueue类中的几个成员变量:

版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表千亿集团立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章