`

Java线程学习笔记(五):线程的优先级

    博客分类:
  • Java
阅读更多

线程的“优先级”将线程的重要性传递给了调度器。尽管CPU处理现有线程集的顺序是不确定的。但是调度器将倾向于让优先权最高的线程先执行。然而,这并不意味着优先权较低的线程将得不到执行(也就是说,优先权不会导致死锁)。优先级较低的线程,仅仅是执行的频率较低。

在绝大多数的时间里,所有线程都应该以默认的优先级运行。

JDK中有10个优先级,但它与大多数操作系统都不能映射的很好。比如,Windows有7个优先级且不是固定的,所以这种映射关系也是不确定的。Sun的Solareis有2的31次方个优先级。唯一可移植的方法是当调整优先级的时候,只使用以下三种级别:

  • Thread.MIN_PRIORITY = 1
  • Thread.NORM_PRIORITY = 5
  • Thread.MAX_PRIORITY = 10

示例:

public class SimplePriorities implements Runnable {
	
	private int countDown = 5;
	private volatile double d;
	private int priority;
	
	public SimplePriorities(int priority) {
		this.priority = priority;
	}
	
	public String toString() {
		return Thread.currentThread() + ": " + countDown;
	}
	
	public void run() {
		Thread.currentThread().setPriority(priority);
		while (true) {
			for (int i = 0; i < 100000; i++) {
				d += (Math.PI + Math.E) / i;
				if (i % 1000 == 0) 
					Thread.yield();
			}
			System.out.println(this);
			if (--countDown == 0) 
				return;
		}
	}
	
	public static void main(String[] args) {
		Thread t1 = new Thread(new SimplePriorities(Thread.MIN_PRIORITY));
		Thread t2 = new Thread(new SimplePriorities(Thread.NORM_PRIORITY));
		Thread t3 = new Thread(new SimplePriorities(Thread.MIN_PRIORITY));
		Thread t4 = new Thread(new SimplePriorities(Thread.NORM_PRIORITY));
		Thread t5 = new Thread(new SimplePriorities(Thread.MIN_PRIORITY));
		Thread t = new Thread(new SimplePriorities(Thread.MAX_PRIORITY));
		
		t1.start();
		t2.start();
		t3.start();
		t4.start();
		t5.start();
		
		t.start();
	}
}
执行结果 写道
Thread[Thread-5,10,main]: 5
Thread[Thread-3,5,main]: 5
Thread[Thread-5,10,main]: 4
Thread[Thread-3,5,main]: 4
Thread[Thread-5,10,main]: 3
Thread[Thread-3,5,main]: 3
Thread[Thread-5,10,main]: 2
Thread[Thread-3,5,main]: 2
Thread[Thread-5,10,main]: 1
Thread[Thread-3,5,main]: 1
Thread[Thread-1,5,main]: 5
Thread[Thread-1,5,main]: 4
Thread[Thread-1,5,main]: 3
Thread[Thread-4,1,main]: 5
Thread[Thread-2,1,main]: 5
Thread[Thread-0,1,main]: 5
Thread[Thread-1,5,main]: 2
Thread[Thread-1,5,main]: 1
Thread[Thread-4,1,main]: 4
Thread[Thread-2,1,main]: 4
Thread[Thread-0,1,main]: 4
Thread[Thread-4,1,main]: 3
Thread[Thread-2,1,main]: 3
Thread[Thread-0,1,main]: 3
Thread[Thread-4,1,main]: 2
Thread[Thread-2,1,main]: 2
Thread[Thread-0,1,main]: 2
Thread[Thread-4,1,main]: 1
Thread[Thread-2,1,main]: 1
Thread[Thread-0,1,main]: 1

 分析:

  • 注意,优先级的设置是在run()方法的开头进行的,在构造函数中设置并无什么好处,因为此时线程并未开始执行
  • 代码中加入了数学运算,造成较大开销,目的是为了更好的体现优先级设置的效果
  • 控制台输出也会有较大的开销,但是不能被中断,而复杂的浮点运算,可以被中断
  • 只有数学运算的时间足够长,线程调度机制才来得及介入,交换任务并关注优先级,使得最高优先级线程被最先选择。

 本文源自《Thinking in Java》(Fourth Edition)——21.2.6 优先级(其中内容略有调整,主体思想源自该章节)。

 

分享到:
评论

相关推荐

    java多线程笔记

    Java线程:线程的调度-优先级 16 Java线程:线程的调度-让步 19 Java线程:线程的调度-合并 22 Java线程:线程的调度-终止线程 25 Java线程:线程的调度-守护线程 28 Java线程:线程组 30 Java线程:线程的同步 33 ...

    java线程学习笔记

    2.3 线程本地存储(Java.lang.ThreadLocal) 15 2.4 线程阻塞 17 2.4.1 调用sleep(millisecond)使任务进入休眠状态 17 2.4.2 等待输出与输入 17 2.4.3 对象锁不可用 17 2.4.4 通过wait()使线程挂起。 17 2.5 线程...

    Java多线程学习笔记

    线程的基本概念 线程的创建和启动 线程的调度和优先级 线程的状态控制 线程同步

    Java并发编程(学习笔记).xmind

    要避免使用线程优先级,因为这会增加平台依赖性,并可能导致活跃性问题。在大多数并发应用程序中,都可以使用默认的线程优先级。 糟糕的响应性 如果由其他线程完成的工作都是后台任务,那么应该降低...

    java8源码-JavaSE-Code:JavaSE的代码练习与学习笔记总结

    第一章:Java多线程技能 线程是进程中的子任务 interrupted与isInterrupted的区别: interrupted是Thread类的静态方法,里面调用了isTnterrupted方法[currentThread().isInterrupted()],测试当前线程是否已经中断,线程...

    整理后java开发全套达内学习笔记(含练习)

    Thread [java] 线程 [θred] throw (关键字) throws (关键字) [θrәu] 抛出(异常) transient (关键字) 瞬变;临时的['trænziәnt]'(可序列化) valid 正确的,有效的 ['vælid] variable n.变量 a.可变的['vєә...

    net学习笔记及其他代码应用

    1. 简述 private、 protected、 public、 internal 修饰符的访问权限。 答 . private : 私有成员, 在类的内部才可以访问。...47.当一个线程进入一个对象的一个synchronized方法后,其它线程是否可...

    Android学习笔记.pdf

    包括环境搭建教程、创建模拟器、新建helloworld程序、电话拨号器、软件部署到模拟器、短信发送器、线性布局、相对布局、日志、activity、Android进程线程及优先级、Android UI线程阻塞及优化、广播接受者、Service...

    rt thread自学笔记

    基于rt-thread官网上的内核说明文档,自己做了详细的注释,希望对大家学习有所帮助。 RT-Thread,全称是 Real Time-Thread,顾名思义,它是一个嵌入式实时多线程操作系统,基本属性之一是支持多任务,允许多个任务...

    中美 IT 培训 C# Asp.net 全套笔记1

    (40课时) 系统地讲授多线程的基本概念、线程的设计、线程的优先级等以及线程的使用;讲授共享程序集(公有程序集)、私有程序集的组成、原理和使用;学习反射(Reflection)、属性(Attribute)的相关概念和使用。...

    中美 IT 培训 C# Asp.net 笔记2

    (40课时) 系统地讲授多线程的基本概念、线程的设计、线程的优先级等以及线程的使用;讲授共享程序集(公有程序集)、私有程序集的组成、原理和使用;学习反射(Reflection)、属性(Attribute)的相关概念和使用。...

    中美 IT 培训 C# Asp.net 笔记3

    (40课时) 系统地讲授多线程的基本概念、线程的设计、线程的优先级等以及线程的使用;讲授共享程序集(公有程序集)、私有程序集的组成、原理和使用;学习反射(Reflection)、属性(Attribute)的相关概念和使用。...

    值类型与引用类型理论内容.part01.rar

    ASP.NET培训资料(笔记版)(AJAX,C#,JavaScript,SQL) 详细的资料 三个月的课程录像+资料笔记(花了一万六千块的培训资料超值【19G的经典内容】 认真学习后包你能成为优秀的.net程序员 &lt;br&gt;(注明:不是...

    值类型与引用类型理论内容.part05.rar

    C#,JavaScript,SQL) &lt;br&gt;我将不定期发布,直至所有课程完毕 &lt;br&gt;详细的资料 三个月的课程录像+资料笔记(花了一万六千块的培训资料超值【19G的经典内容】 认真学习后包你能成为优秀的.net程序员 ...

Global site tag (gtag.js) - Google Analytics