您的位置:首页 > 编程语言 > Java开发

java中关于优先级队列的实现

2013-01-30 13:22 585 查看
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<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并实现Comparable接口,然后自已重写过compareTo方法就能实现很强大的优先级队列了,不过缺点是线程不安全的! 代码如下:
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); //优先级最高

pTest.add("bbb",2);

pTest.add("ccc",1);

while(!pTest.isEmpty()){

System.out.println(pTest.remove());

}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 优先级