ReentrantLock 设 置 为 true
来 达 到 这 种 公 平 性 的 : 即 等 待 时 间 最 长 的 线 程 会 先 操
作)。通常,公平性会使你在性能上付出代价,只有在的确非常需要的时候再使用
它。它是基于数组的阻塞循环队 列,此队列按 FIFO(先进先出)原则对元素进行
排序。
PriorityBlockingQueue
是 一个带优先级的 队列,而不是先进先出队列。元素按优先
级 顺 序 被 移 除 , 该 队 列 也 没 有 上 限 ( 看 了 一 下 源 码 , PriorityBlockingQueue 是 对
PriorityQueue 的再次包装,是基于堆数据结构的,而 PriorityQueue 是没有容量限制
的,与 ArrayList
一样,所以在优先阻塞 队列上 put 时是不会受阻的。虽然此队列逻
辑 上 是 无 界 的 , 但 是 由 于 资 源 被 耗 尽 , 所 以 试 图 执 行 添 加 操 作 可 能 会 导 致
OutOfMemoryError),但是如果队列为空,那么取元素的操作 take 就会阻塞,所
以它的检索操作 take
是受阻的。另外,往入该队列中的元 素要具有比较能力。
最后,DelayQueue
(基 于 PriorityQueue 来实现的)是一个存放 Delayed 元素的无界
阻塞队列,只有在延迟期满时才能从中提取元素。该队列的头部是延迟期满后保存
时间最长的 Delayed 元素。如果延迟都还没有期满,则队列没有头部,并且 poll 将
返回 null
。当一个元素的 getDelay(TimeUnit.NANOSECONDS) 方法返回一个小于或等
于零的值时,则出现期满,poll
就以移除这个元素了。此队列不允许使用 null 元素。