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
總結
以上是生活随笔為你收集整理的linux某个线程信号唤醒,linux多线程编程--信号量和条件变量 唤醒丢失事件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python画三维立体图难吗_万万没想到
- 下一篇: 翻转链表python递归_Python实