问题:怎么3实现线程优先级别调度,用java1.4的时候我们可能马上想到线程类的join()方法。
JDK1.5之后,Java标准库引入了Doug Lea的并发库,即:java.util.concurrent这个包。我们再也不要为此大伤脑经了。看看我们的java.util.concurrent.PriorityBlockingQueue吧。顾名思义:一个具有优先调度阻塞队列。
看官方API怎么说:一个无界的阻塞队列,它使用与类 PriorityQueue 相同的顺序规则,并且提供了阻塞检索的操作。
我们只需要把放入该队列的对象实现Comparable接口就可以轻松实现线程优先级调度了。
下面写一个简单的demo帮助理解吧。
背景:一个车站,有固定车位,有一个出站口。我们知道车站有快车慢车,长途短途等之分。在此我们统一简化为出站优先级,出站顺序根据站内车优先级别排列。
import java.util.concurrent.PriorityBlockingQueue;
public class ThreadPriorityScheduleDemo {
private static final int MAX_PARKING = 50;
/**
* @param args
*/
public static void main(String[] args) {
ThreadPriorityScheduleDemo instance = new ThreadPriorityScheduleDemo();
instance.busEnter(new Bus("粤A12345", 2, 5));
instance.busEnter(new Bus("粤A88888", 1, 2));
instance.busEnter(new Bus("粤A66666", 2, 6));
instance.busEnter(new Bus("粤A33333", 1, 7));
instance.busEnter(new Bus("粤A21123", 2, 1));
instance.busEnter(new Bus("粤AGG892", 1, 4));
instance.busEnter(new Bus("粤AJJ000", 2, 9));
while(true){
instance.busQuit();
}
}
private static final PriorityBlockingQueue<Bus> busStation = new PriorityBlockingQueue<Bus>(MAX_PARKING);
/**
* 车辆进站
* @param bus
*/
private void busEnter(Bus bus){
// System.out.println("进站-->"+bus.toString());
if(busStation.size()<MAX_PARKING)
busStation.add(bus);
else
System.out.println("站内车位已满");
}
/**
* 车辆出站
*/
private void busQuit(){
try {
Bus bus = busStation.take();
System.out.println("出站-->"+bus.toString());
} catch (InterruptedException e) {
}
}
/**
* 车实例
* @author jiangw
*
* 2010-3-26
*/
static class Bus implements Comparable<Bus>{
private String busNo;
private Integer busType;
private Integer level;
private Bus() {}
private Bus(String busNo, Integer busType, Integer level) {
super();
this.busNo = busNo;
this.busType = busType;
this.level = level;
}
public String getBusNo() {
return busNo;
}
public void setBusNo(String busNo) {
this.busNo = busNo;
}
public Integer getBusType() {
return busType;
}
public void setBusType(Integer busType) {
this.busType = busType;
}
public Integer getLevel() {
return level;
}
public void setLevel(Integer level) {
this.level = level;
}
@Override
public int compareTo(Bus o) {
if(o instanceof Bus){
return (level>o.level)?1:-1;
}
return 0;
}
@Override
public String toString() {
return "当前车信息:种类["+busType+"]车牌["+busNo+"]优先级["+level+"]";
}
}
}
运行结果:
出站-->当前车信息:种类[2]车牌[粤A21123]优先级[1]
出站-->当前车信息:种类[1]车牌[粤A88888]优先级[2]
出站-->当前车信息:种类[1]车牌[粤AGG892]优先级[4]
出站-->当前车信息:种类[2]车牌[粤A12345]优先级[5]
出站-->当前车信息:种类[2]车牌[粤A66666]优先级[6]
出站-->当前车信息:种类[1]车牌[粤A33333]优先级[7]
出站-->当前车信息:种类[2]车牌[粤AJJ000]优先级[9]
分享到:
相关推荐
Nachos实现id、限制线程数和按优先级调度算法(增改源码) Nachos实现id、限制线程数和按优先级调度算法
10.如何使用线程优先级?(Visual C++编程 源代码)10.如何使用线程优先级?(Visual C++编程 源代码)10.如何使用线程优先级?(Visual C++编程 源代码)10.如何使用线程优先级?(Visual C++编程 源代码)10.如何...
VC++ 线程优先级 示例程序 VC++线程优先级示例程序-赛马,不同优先级执行的程序显示在进度条中,有长有短,像赛马一样,体现出每个线程被执行的优先顺序。
VC 线程优先级 赛马演示 VC 线程优先级 赛马演示 VC 线程优先级 赛马演示
VisualC 实效编程 61 线程优先级示例-赛马VisualC 实效编程 61 线程优先级示例-赛马VisualC 实效编程 61 线程优先级示例-赛马VisualC 实效编程 61 线程优先级示例-赛马VisualC 实效编程 61 线程优先级示例-赛马...
* <p>Title: 提高线程优先级 * <p>Description: 通过修改线程的优先级,是线程获得优先处理。 * <p>Copyright: Copyright (c) 2003 * <p>Filename: upPRIThread.java * @author * @version 1.0
多核课程 多线程优先级示例_赛马 通过例子来演示多线程优先级
易语言源码易语言设定线程优先级源码完整版-带支持库
VC 用进度条表示多线程优先级执行问题,程序将演示各个线程执行的优先级,当然这是在程序中设置好的,程序将按照设定运行各个线程,当然,优先级不一样,将按以下顺序启动线程:关键时间最先执行,最高其次,然后...
易语言源码易语言设定线程优先级源码.rar 易语言源码易语言设定线程优先级源码.rar 易语言源码易语言设定线程优先级源码.rar 易语言源码易语言设定线程优先级源码.rar 易语言源码易语言设定线程优先级源码.rar ...
设置线程的优先级,设置参数 afebegeinthreand 设置参数 简单dedemo vc2008
该程序演示了多线程的优先级问题,通过运行状态比较了线程的优先级不同时每个线程的进展情况。
创建多个具有不同优先级的工作线程的简单例子..............
java 排座位(线程优先级) java 排座位(线程优先级) java 排座位(线程优先级)
VC++6.0做的一个创建多线程并设置不同的优先级的小程序
线程数目不超过128,实现基于优先级的线程调度
通过配置线程调度策略与优先级,可使各线程按照设定的顺序执行,从而达到线程间同步的目的,线程属性配置函数包括: pthread_attr_init(&attr[i]);// 初始化线程属性 pthread_attr_setschedpolicy(&attr[i], SCHED...
NachOS线程调度_基于优先级和Round Robin算法
进程、线程和优先级 工作线程和用户界面线程 线程同步 线程通讯
如何使用线程优先级?想学习的同志可以看看,可以编译很好的