读书人

优先级的行列任务调度

发布时间: 2012-10-31 14:37:32 作者: rapoo

优先级的队列任务调度

使用java.util.concurrent 包,让我们有了一个快捷的的方式实现多线程调度。

在一个项目中要实现一个带优先级的的线程调度,可是Thread的priority属性并不能保证优先级高的线程对象优先调度

我选用的PriorityBlockingQueue来实现。PriorityBlockingQueue是个排序队列,要求放入的对象是可以排序的才行

?

第一步: 实现可排序的线程类

?如:

?public class TargetThread extends Thread implements Comparable<TargetThread>{

??

??private Integer targetId;
? private int frequency;??//频率高的要先运行

?/**
?? * Override equals 方法,以便于在TargetTable里的set里避免重复对象
?? */
? public boolean equals(Object obj) {
?? TargetThread oo = (TargetThread) obj;
?? return (oo.getTargetId().intValue() == this.targetId.intValue());
? }

/**

* 排序比较频率高

*/

?public int compareTo(TargetThread t) {
??if(this.frequency < t.frequency) return -1;
??if(this.frequency > t.frequency) return 1;
??return 0;
?}

public void run() {

// do something

}

?}

?

第二步: 把执行的线程放入PriorityBlockingQueue中,项目要执行的线程在某个时刻可能上千个,这时放入队列后,频率高的就会排在前面,而不是先进先出了。

?

第三步:执行队列里的线程

TargetThread t = PriorityBlockingQueue.poll();

t.start();

?

这样,一个带优先级的队列就实现了,具体在调度的时候,还可以使用concurrent的Executor来run一个线程对象。

?

?

?

1 楼 icefishc 2008-12-03 Hello,
我对您的第三步有些疑问.
按照我的理解t.start(); 只是告诉JVM t可以start了, 并不表明t真的就start了
请问您是否能解释一下呢? 谢谢。 2 楼 thinkact 2008-12-03 icefishc 写道
Hello,我对您的第三步有些疑问.按照我的理解t.start(); 只是告诉JVM t可以start了, 并不表明t真的就start了请问您是否能解释一下呢? 谢谢。

是的,实际应用中我还做了一个最大活动线程数控制,这样保证从队列里拿出来要执行的对象是优先级较高的。

读书人网 >软件架构设计

热点推荐