为什么PriorityBlockingQueue队列没有按照优先级对元素进行排序
Why hasn't the PriorityBlockingQueue queue to sort elements according to the priority
这是我的代码,代码运行结尾不是我的例外
我认为PriorityBlockingQueue按优先级排序,但结果不是我的预期,谁能告诉我为什么。
public class TestPriorityQueue {
static Random r=new Random(47);
public static void main(String args[]) throws InterruptedException{
final PriorityBlockingQueue q=new PriorityBlockingQueue();
ExecutorService se=Executors.newCachedThreadPool();
//execute producer
se.execute(new Runnable(){
public void run() {
int i=0;
while(true){
q.put(new PriorityEntity(r.nextInt(10),i++));
try {
TimeUnit.MILLISECONDS.sleep(r.nextInt(1000));
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
});
//execute consumer
se.execute(new Runnable(){
public void run() {
while(true){
try {
System.out.println("take== "+q.take()+" left:== ["+q.toString()+"]");
try {
TimeUnit.MILLISECONDS.sleep(r.nextInt(1000));
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
try {
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("shutdown");
}
}
class PriorityEntity implements Comparable<PriorityEntity> {
private static int count=0;
private int id=count++;
private int priority;
private int index=0;
public PriorityEntity(int priority,int index) {
this.priority = priority;
this.index=index;
}
public String toString(){
return id+"* [index="+index+" priority="+priority+"]";
}
//数字大,优先级高
public int compareTo(PriorityEntity o) {
return this.priority < o.priority ? 1
: this.priority > o.priority ? -1 : 0;
}
}
结果如下,非常感谢您的帮助
一些观察:
- 在大多数情况下,队列的大小为 1。显然,排序顺序与其中任何一个无关。
- 在少数情况下,队列大小 可能 为两个,在这种情况下,输出不会暗示较低优先级的元素是首选。我强调动词 "insinuate" 因为...
您的代码没有同步块,因此不会阻止以下操作序列:
q.take(); // consumer thread
q.put(); // producer thread
q.toString(); // consumer thread
q.toString()
的合法结果显示出比采用的元素具有更高优先级的元素。
这是我的代码,代码运行结尾不是我的例外
我认为PriorityBlockingQueue按优先级排序,但结果不是我的预期,谁能告诉我为什么。
public class TestPriorityQueue {
static Random r=new Random(47);
public static void main(String args[]) throws InterruptedException{
final PriorityBlockingQueue q=new PriorityBlockingQueue();
ExecutorService se=Executors.newCachedThreadPool();
//execute producer
se.execute(new Runnable(){
public void run() {
int i=0;
while(true){
q.put(new PriorityEntity(r.nextInt(10),i++));
try {
TimeUnit.MILLISECONDS.sleep(r.nextInt(1000));
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
});
//execute consumer
se.execute(new Runnable(){
public void run() {
while(true){
try {
System.out.println("take== "+q.take()+" left:== ["+q.toString()+"]");
try {
TimeUnit.MILLISECONDS.sleep(r.nextInt(1000));
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
try {
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("shutdown");
}
}
class PriorityEntity implements Comparable<PriorityEntity> {
private static int count=0;
private int id=count++;
private int priority;
private int index=0;
public PriorityEntity(int priority,int index) {
this.priority = priority;
this.index=index;
}
public String toString(){
return id+"* [index="+index+" priority="+priority+"]";
}
//数字大,优先级高
public int compareTo(PriorityEntity o) {
return this.priority < o.priority ? 1
: this.priority > o.priority ? -1 : 0;
}
}
结果如下,非常感谢您的帮助
一些观察:
- 在大多数情况下,队列的大小为 1。显然,排序顺序与其中任何一个无关。
- 在少数情况下,队列大小 可能 为两个,在这种情况下,输出不会暗示较低优先级的元素是首选。我强调动词 "insinuate" 因为...
您的代码没有同步块,因此不会阻止以下操作序列:
q.take(); // consumer thread q.put(); // producer thread q.toString(); // consumer thread
q.toString()
的合法结果显示出比采用的元素具有更高优先级的元素。