优先级的队列任务调度

使用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一个线程对象。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值