background image

ReentrantLock 设 置 为 true

 

来 达 到 这 种 公 平 性 的 : 即 等 待 时 间 最 长 的 线 程 会 先 操

作)。通常,公平性会使你在性能上付出代价,只有在的确非常需要的时候再使用

 

 

它。它是基于数组的阻塞循环队 列,此队列按 FIFO(先进先出)原则对元素进行

排序。

PriorityBlockingQueue

 

 

是 一个带优先级的 队列,而不是先进先出队列。元素按优先

级 顺 序 被 移 除 , 该 队 列 也 没 有 上 限 ( 看 了 一 下 源 码 , PriorityBlockingQueue 是 对 

PriorityQueue 的再次包装,是基于堆数据结构的,而 PriorityQueue 是没有容量限制

的,与 ArrayList

 

一样,所以在优先阻塞 队列上 put 时是不会受阻的。虽然此队列逻

辑 上 是 无 界 的 , 但 是 由 于 资 源 被 耗 尽 , 所 以 试 图 执 行 添 加 操 作 可 能 会 导 致  

OutOfMemoryError),但是如果队列为空,那么取元素的操作 take 就会阻塞,所

以它的检索操作 take

 

是受阻的。另外,往入该队列中的元 素要具有比较能力。

最后,DelayQueue

 

(基 于 PriorityQueue 来实现的)是一个存放 Delayed 元素的无界

阻塞队列,只有在延迟期满时才能从中提取元素。该队列的头部是延迟期满后保存

 

时间最长的 Delayed 元素。如果延迟都还没有期满,则队列没有头部,并且 poll 

返回 null

 

。当一个元素的 getDelay(TimeUnit.NANOSECONDS) 方法返回一个小于或等

于零的值时,则出现期满,poll

 

就以移除这个元素了。此队列不允许使用 null 元素。