java 编程思想中的PriorityBlockingQueue 部分里对PrioritizedTask的排序没有显式调用collection的sort方法。而是通过take时做的这个动作

本文详细解析了PriorityBlockingQueue在take方法中如何通过compareTo方法自动排序,并解释了为何不需要调用Collections.sort方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



java 编程思想中的PriorityBlockingQueue 在take是会调用comparable 的compareTo进行排序,故不需要显式调用collection的sort方法

这个方法是PriorityBlockingQueue的:

public E take() throws InterruptedException {
    ReentrantLock localReentrantLock = this.lock;
    localReentrantLock.lockInterruptibly();
    try {
      try {
        while (this.q.size() == 0)
          this.notEmpty.await();
      } catch (InterruptedException localInterruptedException) {
        this.notEmpty.signal();
        throw localInterruptedException;
      }
      Object localObject1 = this.q.poll();//调用了poll方法并对poll进行了判空,这个poll是PriorityQueue的poll
      assert (localObject1 != null);
      return localObject1;
    } finally {
      localReentrantLock.unlock();
    }
  }




PriorityQueue的poll方法:

public E poll() {
    if (this.size == 0)
      return null;
    int i = --this.size;
    this.modCount += 1;
    Object localObject1 = this.queue[0];
    Object localObject2 = this.queue[i];
    this.queue[i] = null;
    if (i != 0)
      siftDown(0, localObject2);//调用了内部的siftDown进行排序
    return localObject1;
  }


private void siftDown(int paramInt, E paramE)
  {
    if (this.comparator != null)
      siftDownUsingComparator(paramInt, paramE);
    else
      siftDownComparable(paramInt, paramE);//java编程思想用的是comparable.
  }


private void siftDownComparable(int paramInt, E paramE) {
    Comparable localComparable = (Comparable)paramE;
    int i = this.size >>> 1;
    while (paramInt < i) {
      int j = (paramInt << 1) + 1;
      Object localObject = this.queue[j];
      int k = j + 1;
      if ((k < this.size) && (((Comparable)localObject).compareTo(this.queue[k]) > 0))
      {
        localObject = this.queue[(j = k)];
      }if (localComparable.compareTo(localObject) <= 0)//调用了添加到PriorityBlockingQueue的元素的compareTo方法,java编程思想是重写了comparable的compareTo
        break;
      this.queue[paramInt] = localObject;
      paramInt = j;
    }
    this.queue[paramInt] = localComparable;
  }


java 编程思想的PrioritizedTask继承并重写了compareTo,详情请参考java编程思想4版728页。所以在本书中得到例子并没有调用Collections.sort(list).

至此我个人的疑惑



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值