为什么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. 在大多数情况下,队列的大小为 1。显然,排序顺序与其中任何一个无关。
  2. 在少数情况下,队列大小 可能 为两个,在这种情况下,输出不会暗示较低优先级的元素是首选。我强调动词 "insinuate" 因为...
  3. 您的代码没有同步块,因此不会阻止以下操作序列:

    q.take();     // consumer thread
    q.put();      // producer thread
    q.toString(); // consumer thread
    

    q.toString() 的合法结果显示出比采用的元素具有更高优先级的元素。