线程的“优先级”将线程的重要性传递给了调度器。尽管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 线程学习笔记 Java 线程创建有两种方法: 1. 继承 Thread 类,重写 run 方法:通过继承 Thread 类并重写 run 方法来创建线程,这种方法可以使线程具有自己的执行逻辑。 2. 实现 Runnable 接口:通过实现 ...
### Java多线程学习笔记 #### 一、线程的基本概念 在计算机科学中,**线程**(Thread)是程序执行流的最小单位。一个标准的程序只能做一件事情,而通过多线程技术,可以让程序同时处理多个任务。在Java中,线程是...
优先级(`setPriority()`),允许为线程设置优先级以影响调度;让步(`yield()`),让当前运行的线程暂停,给其他线程执行机会;合并(线程合并),通过`join()`方法等待另一个线程结束;以及终止线程(`stop()`或`...
这篇“Java线程编程学习笔记(二)”很可能是对Java并发编程深入探讨的一部分,特别是涉及多线程示例的实践应用。我们将从标题、描述以及标签来推测可能涵盖的知识点,并结合"Multi-Threads Demo"这一压缩包文件名来...
为了避免这些问题,我们需要合理设计同步策略,如使用死锁预防或避免算法,以及设置适当的线程优先级。 总的来说,Java多线程是复杂且重要的主题,它涉及到线程的创建与控制、同步与通信、并发编程的最佳实践等多个...
本笔记全面涵盖了多线程的学习,包括基础理论和实践代码,旨在帮助开发者深入理解并掌握Java多线程技术。 一、线程基础知识 线程是操作系统分配CPU时间的基本单位,一个进程中可以包含多个线程。Java通过`Thread`类...
- **线程类型**:Java中的线程分为用户线程和守护线程。用户线程是程序的主要执行者,当所有用户线程结束时,JVM会自动退出。而守护线程,如垃圾回收器,即使没有用户线程也会继续运行,直到JVM停止。 3. **创建与...
10. **线程间的通信**:Java的BlockingQueue接口和相关的类(如ArrayBlockingQueue、LinkedBlockingQueue)提供了一种线程间通信的方式,允许线程在生产数据和消费数据之间进行协作。 马士兵的多线程训练营资料1和...
本学习笔记将深入探讨Java多线程的相关知识,包括其原理、实现方式、同步机制以及常见问题。 ### 一、多线程的基本概念 多线程是指在一个程序中存在两个或更多的执行线程,这些线程共享同一内存空间,但各自拥有...
- **题3**:模拟三个线程(代表老师)分发学习笔记,可以使用synchronized关键字或Lock接口(如ReentrantLock)确保线程安全地分配资源。 8. **实验结果和分析**: 实验的结果将展示线程并发执行的特点,例如线程...
Java多线程是Java编程中的重要概念,它允许程序同时执行多个任务,从而提高系统效率和资源利用率。在Java中,实现多线程有两种主要方式:通过实现`Runnable`接口和继承`Thread`类。 首先,让我们从创建线程开始。当...
这份"C++多线程学习笔记1"涵盖了基础到进阶的多线程概念,旨在帮助初学者快速掌握这一关键技能。 首先,C++11引入了对多线程的支持,引入了`<thread>`库,使得创建和管理线程变得简单。创建一个新的线程可以使用`...
5. **线程优先级**: - **Thread.Priority**:设置线程的优先级,可以调整线程调度的优先级,但不保证绝对执行顺序。 6. **异步编程**: - **async/await**:C# 5.0引入的异步编程模型,使代码更易读且性能良好。...
Java精华学习笔记主要涵盖了Java编程语言的核心概念、关键特性以及实战技巧。这些笔记是作者在深入学习Java过程中积累的经验总结,旨在帮助初学者快速理解和掌握Java编程。 1. **Java基础** - **数据类型**: Java...
线程的优先级在不同的操作系统中有所不同,Java提供了10个级别的优先级,但并不保证优先级高的线程一定会先执行,因为线程调度策略由操作系统决定。在Java中,可以通过setPriority()方法设置线程的优先级,但在多...
在深入探讨多线程Unix编程之前,...学习笔记中的内容可能涵盖了以上各个知识点的实例、代码示例和解析,帮助你理解和实践多线程Unix编程。通过不断实践和学习,你将能够熟练地在Unix环境中编写高效的多线程应用程序。