yuyee

PriorityBlockingQueue

PriorityBlockingQueue:一个无界的阻塞队列,它使用与类 PriorityQueue 相同的顺序规则,并且提供了阻塞检索的操作。虽然此队列逻辑上是无界的,但是由于资源被耗尽,所以试图执行添加操作可能会失败(导致 OutOfMemoryError)。此类不允许使用 null 元素。依赖自然顺序的优先级队列也不允许插入不可比较的对象(因为这样做会抛出 ClassCastException)。

 PriorityBlockingQueue()

          用默认的初始容量 (11) 创建一个 PriorityBlockingQueue,并根据元素的自然顺序排序其元素(使用 Comparable)。 PriorityBlockingQueue(Collection<? extends E> c)
          创建一个包含指定集合中元素的 PriorityBlockingQueuePriorityBlockingQueue(int initialCapacity)
          使用指定的初始容量创建一个 PriorityBlockingQueue,并根据元素的自然顺序排序其元素(使用 Comparable)。 PriorityBlockingQueue(int initialCapacity, Comparator<? super E> comparator)
          使用指定的初始容量创建一个 PriorityBlockingQueue,并根据指定的比较器排序其元素。

此类每次offer元素,都会有一个fixup操作,也就是排序,如果没有构造的时候传入自己实现的比较器,就采用自然排序,否则采用比较器规则,进行二分查找,比较,保持列头是比较器希望的那个最大或则最小元素。
 private void fixUp(int k) {
        if (comparator == null) {
            while (k > 1) {
                int j = k >> 1;
                if (((Comparable<E>)queue[j]).compareTo((E)queue[k]) <= 0)
                    break;
                Object tmp = queue[j];  queue[j] = queue[k]; queue[k] = tmp;
                k = j;
            }
        } else {
            while (k > 1) {
                int j = k >>> 1;
                if (comparator.compare((E)queue[j], (E)queue[k]) <= 0)
                    break;
                Object tmp = queue[j];  queue[j] = queue[k]; queue[k] = tmp;
                k = j;
            }
        }
    }

posted on 2010-11-01 16:33 羔羊 阅读(869) 评论(0)  编辑  收藏


只有注册用户登录后才能发表评论。


网站导航: