java 编程思想中的PriorityBlockingQueue 部分里对PrioritizedTask的排序没有显式调用collection的sort方法。而是通过take时做的这个动作
来源:互联网 发布:上海奉贤云计算公司 编辑:程序博客网 时间:2024/06/05 14:18
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).
至此我个人的疑惑
- java 编程思想中的PriorityBlockingQueue 部分里对PrioritizedTask的排序没有显式调用collection的sort方法。而是通过take时做的这个动作
- 通过扩展 PriorityBlockingQueue 的 take() 实现任务定时触发
- java 中的 collections.sort() 方法对list的排序
- java-容器-collection的sort方法
- java-容器-collection的sort方法
- 用Java集合中的Collections.sort方法对list排序的两种方法
- 用Java集合中的Collections.sort方法对list排序的两种方法
- (好使)用Java集合中的Collections.sort方法对list排序的两种方法
- 用Java集合中的Collections.sort方法对list排序的两种方法
- 用Java集合中的Collections.sort()方法对list排序的两种方法
- 用Java集合中的Collections.sort方法对list排序的两种方法
- 用Java集合中的Collections.sort方法对list排序的两种方法
- 用Collection.sort对List做排序
- Java 数序和集合框架的转化 & Collection.sort()方法排序的两种方式
- Java-Collections的sort方法对list进行排序
- Java-Collections的sort方法对 list 进行排序
- list 的自定义排序 Collection.sort()方法个人学习总结
- Java集合对象的排序使用Collection.sort方法,先实现Comparable接口
- ubuntu自动挂载ISCSI硬盘
- Python学习笔记《Head first for Python》
- GCC
- OSI七层模型与TCP/IP五层模型
- 二叉树
- java 编程思想中的PriorityBlockingQueue 部分里对PrioritizedTask的排序没有显式调用collection的sort方法。而是通过take时做的这个动作
- 去掉Mybatis Generator生成的一堆 example
- 锋利的jQuery ajax(二)
- generator自动生成mybatis的xml配置、model、map
- Nginx+Tomcat配置
- DFS与BFS遍历
- java实现单链表(增加节点,删除节点,根据下标获取节点,获取链表大小,链表逆序)
- 二叉树
- mbatis Mapped Statements collection already contains value for...Mybatis