from:http://hi.baidu.com/angelstroll/item/0b8062ea7b425af0e0a5d4a7

个人以为处理优先级的第一个思路可以借鉴。但,较普遍的使用场景不是这种。

 

这几天一直在搞关于优先级队列的实现,因为要考虑到线程的安全,所以PriorityQueue就不适用了。一个非常简单的实现方法,那就是把优先级比较好的插入一个队列,优先级低的插入另一个队列,取数的时候先在优先级高的队列上取数。这有个缺点就是如果优先级别越多的话,队列就越多。        因为要线程安全,队列采用ConcurrentLinkedQueue这个线程安全的,而api文档上说ConcurrentLinkedQueue采用了有效的“无等待 (wait-free)”算法,所以它的吞吐量是很不错的!    简单代码如下:

package test;

 

import java.util.concurrent.ConcurrentLinkedQueue;


public class PriorityQueueTest {


    public static void main(String[] args) { 
        ConcurrentLinkedQueue highPriority = new ConcurrentLinkedQueue(); //高优先级 
        ConcurrentLinkedQueue lowPriority = new ConcurrentLinkedQueue();  //低优先级 
         
        highPriority.add("aaa"); 
        highPriority.add("bbb"); 
        highPriority.add("111"); 
         
        lowPriority.add("ccc"); 
        lowPriority.add("ddd"); 
        lowPriority.add("222"); 
         
        int i = 0 ,j = 0, k=0; 
        while(true){ 
            while(true){ 
                if(!highPriority.isEmpty()){ 
                    System.out.print(highPriority.remove()); 
                    i++; 
                    k++; 
                    System.out.println(", i = "+i+", k="+k); 
                    break; 
                } 
                if(!lowPriority.isEmpty()){ 
                    System.out.print(lowPriority.remove()); 
                    j++; 
                    k++; 
                    System.out.println(", j = "+j+", k="+k); 
                    break; 
                } 
                break; 
            } 
            try { 
                Thread.sleep(100); 
            } catch (InterruptedException e) { 
                e.printStackTrace(); 
            } 
        } 
    } 
}


 
              还有一种是,通过继承PriorityQueue并实现Comparable接口,然后自已重写过compareTo方法就能实现很强大的优先级队列了,不过缺点是线程不安全的!      代码如下:

package test;


import java.util.PriorityQueue;


public class PriorityTest extends PriorityQueue
    static class Test implements Comparable
        String packet; 
        int priotity; 
         
        public Test(String packet, int priotity) { 
            this.packet = packet; 
            this.priotity = priotity; 
        } 
         
        public int compareTo(Test arg) {  
            if(priotity < arg.priotity) 
                return 1; 
            else if(priotity > arg.priotity) 
                return -1; 
            else 
                return 0; 
        }  
         
        public String toString(){ 
            return packet;  
        } 
    } 
     
    public void add(String str, int priority){ 
        super.add(new Test(str,priority)); 
    } 
     
    public static void main(String args[]){ 
        PriorityTest pTest = new PriorityTest(); 
        pTest.add("aaa",3);  //优先级最高 
        pTest.add("bbb",2); 
        pTest.add("ccc",1); 
         
        while(!pTest.isEmpty()){ 
            System.out.println(pTest.remove()); 
        } 
    } 
}