`
vakin.jiang
  • 浏览: 147208 次
  • 性别: 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  
学习了 谢谢

相关推荐

    Nachos实现id、限制线程数和按优先级调度算法 源码.rar

    总的来说,这个压缩包提供的源码展示了Nachos操作系统如何处理线程管理的核心部分,包括线程的唯一标识、数量控制以及基于优先级的调度策略。通过分析这些源码,我们可以深入了解操作系统内核的设计思想,这对于学习...

    VC++ 线程优先级 示例程序

    例如,我们可以用以下代码设置一个线程的优先级: ```cpp #include // 获取当前线程句柄 HANDLE hThread = GetCurrentThread(); // 设置线程为高优先级 SetThreadPriority(hThread, THREAD_PRIORITY_HIGHEST); `...

    设置线程的优先级

    在实际编程中,线程的优先级策略还应考虑线程的实时性需求、系统的整体负载以及资源的竞争状态。对于实时系统,可能需要更精细的优先级设置,而在服务器或桌面应用中,通常推荐使用默认的优先级分配。 总之,理解并...

    vc线程优先级的简单例子例子

    线程优先级则是操作系统调度线程的一种策略,用于决定哪些线程应该先获得CPU执行权。在Windows系统中,VC++作为一款强大的C++集成开发环境,提供了线程管理的功能,包括设置线程优先级。本篇文章将深入探讨线程...

    VC 线程优先级的演示 赛马

    线程的优先级直接影响到CPU资源的分配,优先级高的线程更有可能被调度执行。 在"VC 线程优先级 赛马演示"中,每个线程可以看作是一匹赛马,它们在“跑道”(即程序执行流)上竞争。通过设置不同的优先级,我们可以...

    10.如何使用线程优先级?(Visual C++编程 源代码)

    10.如何使用线程优先级?(Visual C++编程 源代码)10.如何使用线程优先级?(Visual C++编程 源代码)10.如何使用线程优先级?(Visual C++编程 源代码)10.如何使用线程优先级?(Visual C++编程 源代码)10.如何...

    如何使用线程优先级

    线程优先级是操作系统调度策略的一部分,用于决定多个并发运行的线程中哪一个应该被优先执行。在多任务环境中,线程优先级的设定能够帮助优化资源分配,确保关键任务或者高优先级任务得到及时处理。本文将详细介绍...

    VisualC 实效编程 61 线程优先级示例-赛马

    VisualC 实效编程 61 线程优先级示例-赛马VisualC 实效编程 61 线程优先级示例-赛马VisualC 实效编程 61 线程优先级示例-赛马VisualC 实效编程 61 线程优先级示例-赛马VisualC 实效编程 61 线程优先级示例-赛马...

    NachOS线程调度_基于优先级和Round Robin算法

    **优先级调度**是一种常见的线程调度策略,它根据线程的优先级高低来决定哪个线程首先获得CPU执行权。在NachOS中,每个线程被赋予一个优先级,数值越高,优先级越高,意味着该线程越有可能被调度执行。优先级调度...

    线程优先级|java线程优先级

    * &lt;p&gt;Title: 提高线程优先级 * &lt;p&gt;Description: 通过修改线程的优先级,是线程获得优先处理。 * &lt;p&gt;Copyright: Copyright (c) 2003 * &lt;p&gt;Filename: upPRIThread.java * @author * @version 1.0

    C语言线程调度与优先级配置示例

    通过配置线程调度策略与优先级,可使各线程按照设定的顺序执行,从而达到线程间同步的目的,线程属性配置函数包括: pthread_attr_init(&attr[i]);// 初始化线程属性 pthread_attr_setschedpolicy(&attr[i], SCHED...

    易语言设定线程优先级源码.rar

    线程优先级是操作系统调度策略的一部分,它决定了哪个线程会先获得CPU执行权,从而影响程序的执行顺序和响应速度。 线程在多任务操作系统中扮演着重要角色,它们是程序执行的基本单元。线程优先级的设定能够优化...

    java中的线程优先级例子

    为了解决这些问题,Java引入了优先级队列调度策略,但这个策略并不能完全避免优先级反转,因此在设计多线程程序时,应尽量避免过度依赖线程优先级。 此外,Java的线程调度也受到操作系统的限制。在Windows系统中,...

    java 排座位(线程优先级)

    更高的优先级意味着线程更有可能被调度执行,但这并不意味着高优先级的线程一定会比低优先级的线程先执行,因为线程调度还受到其他因素如系统调度策略的影响。 线程的优先级可以通过以下方式设置: ```java Thread...

    线程调度的优先级

    这是因为Java线程调度采用了非确定性的抢占式调度策略,即使优先级较高的线程也可能因为其他原因(如线程休眠、同步锁等)被暂时挂起,让其他线程有机会执行。 Java线程的优先级分为三个级别: 1. **NORM_PRIORITY*...

    处理器优先级调度

    在操作系统设计中,处理器优先级调度是一种核心策略,用于决定哪个进程或线程可以在任何给定的时间获得CPU的执行权。这种调度算法是操作系统管理多任务环境的关键机制,确保系统资源的有效分配,提高整体系统性能和...

    Java 实例 - 线程优先级设置源代码+详细指导教程.zip

    在Java中,线程的调度主要依赖于操作系统的线程调度策略,因此,线程优先级并不总是能精确地控制线程的执行顺序。然而,高优先级的线程通常比低优先级的线程有更高的被调度的可能性。 下面是一个简单的Java线程...

    nachos基于优先级的线程调度实验

    总的来说,这个实验旨在让你深入理解线程调度的原理,并掌握如何在Nachos操作系统中实现基于优先级的调度策略。通过编写和调试代码,你会对操作系统调度、并发编程以及资源管理有更深入的认识。在实际开发中,这样的...

    JAVA100例之实例67JAVA线程优先级

    然而,这并不意味着高优先级的线程一定会先执行或者执行频率更高,因为线程调度是由Java虚拟机(JVM)和操作系统的线程调度策略共同决定的。 在Java中,线程的优先级由`java.lang.Thread`类中的`Priority`枚举表示...

    Java线程优先级.pdf

    但需要注意的是,这并不意味着高优先级的线程一定会比低优先级的线程先执行,因为线程调度受到操作系统调度策略的影响。 在Unix系统中,Java线程优先级的影响相对较小,主要依赖于线程上次运行的时间。而在Windows...

Global site tag (gtag.js) - Google Analytics