使用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一个线程对象。
相关资源:一种基于YARN的高优先级作业调度实现方案