linux某个线程信号唤醒,linux多线程编程--信号量和条件变量 唤醒丢失事件

PriorityQueue有一个特征需要特别注意,即:对于那些通过排序方法判定为“相等”的元素,在通过poll方法依次取出它们时,它们的顺序是不确定的,特别是不会维持插入的顺序。举例说明:假如一个对象Obj,有a,b两个字段,如果Obj对象是按字段a由小到大进行排序的,当向队列依次插入a,b分别为:(1,1),(2,1),(1,2),(2,2),(1,3)的五个元素时,通过poll方法从队头依次取出的元素会是什么呢?首先,一定可以确定的是(1,1),(1,2),(1,3)一定会排在前面,(2,1),(2,2)一定会排在后面,问题在于(1,1),(1,2),(1,3)之间和(2,1),(2,2)之间是如果排序的,习惯上我们希望它们保留插入时的顺序,但是实际上,在PriorityQueue在进行内部排序时,它们的原始插入顺序都被破坏了,所以实际的输出时,相等元素之间的顺序是不确定的。以下是一段验证程序:

import java.util.*;

public class Test1 {

public static void main(String[] args) {

PriorityQueue q = new PriorityQueue();

q.add(new Obj(1,1));

q.add(new Obj(2,1));

q.add(new Obj(1,2));

q.add(new Obj(2,2));

q.add(new Obj(1,3));

int size = q.size();

for (int i = 0; i < size; i++) {

System.out.println(q.poll());

}

System.out.println("--------------------------");

List l = new ArrayList();

l.add(new Obj(1, 1));

l.add(new Obj(2, 1));

l.add(new Obj(1, 2));

l.add(new Obj(2, 2));

l.add(new Obj(1, 3));

Collections.sort(l);

for (Obj obj : l) {

System.out.println(obj);

}

}

public static class Obj implements Comparable {

int a;

int b;

public Obj(int a, int b) {

this.a = a;

this.b = b;

}

@Override

public String toString() {

return "Obj{" +

"a=" + a +

", b=" + b +

‘}‘;

}

@Override

public int compareTo(Obj o) {

return a - o.getA();

}

public int getA() {

return a;

}

public void setA(int a) {

this.a = a;

}

public int getB() {

return b;

}

public void setB(int b) {

this.b = b;

}

}

}

程序的输出是:

Obj{a=1, b=1}

Obj{a=1, b=3}

Obj{a=1, b=2}

Obj{a=2, b=2}

Obj{a=2, b=1}

--------------------------

Obj{a=1, b=1}

Obj{a=1, b=2}

Obj{a=1, b=3}

Obj{a=2, b=1}

Obj{a=2, b=2}

请注意前半段使用PriorityQueue,(1,1),(1,2),(1,3)三者的实际顺序是:(1,1),(1,3),(1,2)。 而使用排序方法排序得到的是我们期望的顺序。这就是PriorityQueue在排序上的一个微妙的地方。

原文:http://blog.csdn.net/yusiguyuan/article/details/20215591

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值