`
vakin.jiang
  • 浏览: 148179 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

用PriorityBlockingQueue简化线程优先级调度策略

    博客分类:
  • J2EE
 
阅读更多
  问题:怎么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]


分享到:
评论
1 楼 babydeed 2011-12-09  
学习了 谢谢

相关推荐

    徒手实现线程池-1

    - **PriorityBlockingQueue**:优先级队列,任务按照优先级顺序执行。 4. **线程池参数**: - **corePoolSize**:线程池的核心线程数,即使空闲也会保持在线。 - **maximumPoolSize**:线程池的最大线程数,超过...

    java并发编程实践

    - **`PriorityBlockingQueue`**:具有优先级的无界阻塞队列。 #### 五、Java并发编程最佳实践 在实际开发过程中,合理运用Java并发编程技术,不仅可以提高程序性能,还能简化复杂度。 ##### 5.1 减少锁的竞争 - ...

    android网络框架-volley分析

    其中,缓存分发器使用了`PriorityBlockingQueue`(基于优先级的阻塞队列),这是一种非常高效的线程安全队列,用于处理生产者消费者模式的问题。 ```java queue.start(); ``` 4. **NetworkDispatcher**:当网络...

    java中queue接口的使用详解

    Java中的`Queue`接口是Java集合框架的一部分,它位于`java.util`包中,是`Collection`接口的子接口。`Queue`接口主要用于实现队列数据...在实际编程中,根据需求选择合适的队列实现,可以简化线程同步,提高系统性能。

    Java并发编程之阻塞队列详解

    3. **PriorityBlockingQueue**:此队列按元素的优先级排序,遵循先进先出(FIFO)原则。它是一个无界的阻塞队列,即没有容量限制。 4. **DelayQueue**:这是一个延时阻塞队列,其中的元素只有在其指定的延迟时间...

Global site tag (gtag.js) - Google Analytics