线程的“优先级”将线程的重要性传递给了调度器。尽管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
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线程:线程的调度-优先级 16 Java线程:线程的调度-让步 19 Java线程:线程的调度-合并 22 Java线程:线程的调度-终止线程 25 Java线程:线程的调度-守护线程 28 Java线程:线程组 30 Java线程:线程的同步 33 ...
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多线程技能 线程是进程中的子任务 interrupted与isInterrupted的区别: interrupted是Thread类的静态方法,里面调用了isTnterrupted方法[currentThread().isInterrupted()],测试当前线程是否已经中断,线程...
Thread [java] 线程 [θred] throw (关键字) throws (关键字) [θrәu] 抛出(异常) transient (关键字) 瞬变;临时的['trænziәnt]'(可序列化) valid 正确的,有效的 ['vælid] variable n.变量 a.可变的['vєә...
1. 简述 private、 protected、 public、 internal 修饰符的访问权限。 答 . private : 私有成员, 在类的内部才可以访问。...47.当一个线程进入一个对象的一个synchronized方法后,其它线程是否可...
包括环境搭建教程、创建模拟器、新建helloworld程序、电话拨号器、软件部署到模拟器、短信发送器、线性布局、相对布局、日志、activity、Android进程线程及优先级、Android UI线程阻塞及优化、广播接受者、Service...
基于rt-thread官网上的内核说明文档,自己做了详细的注释,希望对大家学习有所帮助。 RT-Thread,全称是 Real Time-Thread,顾名思义,它是一个嵌入式实时多线程操作系统,基本属性之一是支持多任务,允许多个任务...
(40课时) 系统地讲授多线程的基本概念、线程的设计、线程的优先级等以及线程的使用;讲授共享程序集(公有程序集)、私有程序集的组成、原理和使用;学习反射(Reflection)、属性(Attribute)的相关概念和使用。...
(40课时) 系统地讲授多线程的基本概念、线程的设计、线程的优先级等以及线程的使用;讲授共享程序集(公有程序集)、私有程序集的组成、原理和使用;学习反射(Reflection)、属性(Attribute)的相关概念和使用。...
(40课时) 系统地讲授多线程的基本概念、线程的设计、线程的优先级等以及线程的使用;讲授共享程序集(公有程序集)、私有程序集的组成、原理和使用;学习反射(Reflection)、属性(Attribute)的相关概念和使用。...
ASP.NET培训资料(笔记版)(AJAX,C#,JavaScript,SQL) 详细的资料 三个月的课程录像+资料笔记(花了一万六千块的培训资料超值【19G的经典内容】 认真学习后包你能成为优秀的.net程序员 <br>(注明:不是...
C#,JavaScript,SQL) <br>我将不定期发布,直至所有课程完毕 <br>详细的资料 三个月的课程录像+资料笔记(花了一万六千块的培训资料超值【19G的经典内容】 认真学习后包你能成为优秀的.net程序员 ...