這幾天一直在搞關(guān)于優(yōu)先級(jí)隊(duì)列的實(shí)現(xiàn),因?yàn)橐紤]到線程的安全,所以PriorityQueue就不適用了。一個(gè)非常簡單的實(shí)現(xiàn)方
法,那就是把優(yōu)先級(jí)比較好的插入一個(gè)隊(duì)列,優(yōu)先級(jí)低的插入另一個(gè)隊(duì)列,取數(shù)的時(shí)候先在優(yōu)先級(jí)高的隊(duì)列上取數(shù)。這有個(gè)缺點(diǎn)就是如果優(yōu)先級(jí)別越多的話,隊(duì)列就
越多。
因?yàn)橐€程安全,隊(duì)列采用ConcurrentLinkedQueue這個(gè)線程安全的,而api文檔上說ConcurrentLinkedQueue采用了有效的“無等待 (wait-free)”算法,所以它的吞吐量是很不錯(cuò)的!
簡單代碼如下:
- package test;
- import java.util.concurrent.ConcurrentLinkedQueue;
- public class PriorityQueueTest {
- public static void main(String[] args) {
- ConcurrentLinkedQueue<String> highPriority = new ConcurrentLinkedQueue<String>();
- ConcurrentLinkedQueue<String> lowPriority = new ConcurrentLinkedQueue<String>();
-
- 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并實(shí)現(xiàn)Comparable接口,然后自已重寫過compareTo方法就能實(shí)現(xiàn)很強(qiáng)大的優(yōu)先級(jí)隊(duì)列了,不過缺點(diǎn)是線程不安全的!
代碼如下:
- package test;
- import java.util.PriorityQueue;
- public class PriorityTest extends PriorityQueue<PriorityTest.Test>{
- static class Test implements Comparable<Test>{
- 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); //優(yōu)先級(jí)最高
- pTest.add("bbb",2);
- pTest.add("ccc",1);
-
- while(!pTest.isEmpty()){
- System.out.println(pTest.remove());
- }
- }
- }
摘自:http://blog.csdn.net/liuzhengkang/archive/2009/01/05/3714047.aspx