`

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 线程学习笔记 Java 线程创建有两种方法: 1. 继承 Thread 类,重写 run 方法:通过继承 Thread 类并重写 run 方法来创建线程,这种方法可以使线程具有自己的执行逻辑。 2. 实现 Runnable 接口:通过实现 ...

    Java多线程学习笔记

    ### Java多线程学习笔记 #### 一、线程的基本概念 在计算机科学中,**线程**(Thread)是程序执行流的最小单位。一个标准的程序只能做一件事情,而通过多线程技术,可以让程序同时处理多个任务。在Java中,线程是...

    java多线程笔记

    优先级(`setPriority()`),允许为线程设置优先级以影响调度;让步(`yield()`),让当前运行的线程暂停,给其他线程执行机会;合并(线程合并),通过`join()`方法等待另一个线程结束;以及终止线程(`stop()`或`...

    Java线程编程学习笔记(二)

    这篇“Java线程编程学习笔记(二)”很可能是对Java并发编程深入探讨的一部分,特别是涉及多线程示例的实践应用。我们将从标题、描述以及标签来推测可能涵盖的知识点,并结合"Multi-Threads Demo"这一压缩包文件名来...

    java多线程学习笔记

    为了避免这些问题,我们需要合理设计同步策略,如使用死锁预防或避免算法,以及设置适当的线程优先级。 总的来说,Java多线程是复杂且重要的主题,它涉及到线程的创建与控制、同步与通信、并发编程的最佳实践等多个...

    java多线程笔记全手打

    本笔记全面涵盖了多线程的学习,包括基础理论和实践代码,旨在帮助开发者深入理解并掌握Java多线程技术。 一、线程基础知识 线程是操作系统分配CPU时间的基本单位,一个进程中可以包含多个线程。Java通过`Thread`类...

    马士兵多线程笔记.zip

    10. **线程间的通信**:Java的BlockingQueue接口和相关的类(如ArrayBlockingQueue、LinkedBlockingQueue)提供了一种线程间通信的方式,允许线程在生产数据和消费数据之间进行协作。 马士兵的多线程训练营资料1和...

    多线程-狂神说Java学习笔记

    本学习笔记将深入探讨Java多线程的相关知识,包括其原理、实现方式、同步机制以及常见问题。 ### 一、多线程的基本概念 多线程是指在一个程序中存在两个或更多的执行线程,这些线程共享同一内存空间,但各自拥有...

    Java实验9多线程设计.doc

    - **题3**:模拟三个线程(代表老师)分发学习笔记,可以使用synchronized关键字或Lock接口(如ReentrantLock)确保线程安全地分配资源。 8. **实验结果和分析**: 实验的结果将展示线程并发执行的特点,例如线程...

    java多线程代码笔记

    Java多线程是Java编程中的重要概念,它允许程序同时执行多个任务,从而提高系统效率和资源利用率。在Java中,实现多线程有两种主要方式:通过实现`Runnable`接口和继承`Thread`类。 首先,让我们从创建线程开始。当...

    C++多线程学习笔记1

    这份"C++多线程学习笔记1"涵盖了基础到进阶的多线程概念,旨在帮助初学者快速掌握这一关键技能。 首先,C++11引入了对多线程的支持,引入了`&lt;thread&gt;`库,使得创建和管理线程变得简单。创建一个新的线程可以使用`...

    C# 多线程笔记和示例讲解

    5. **线程优先级**: - **Thread.Priority**:设置线程的优先级,可以调整线程调度的优先级,但不保证绝对执行顺序。 6. **异步编程**: - **async/await**:C# 5.0引入的异步编程模型,使代码更易读且性能良好。...

    java精华学习笔记

    Java精华学习笔记主要涵盖了Java编程语言的核心概念、关键特性以及实战技巧。这些笔记是作者在深入学习Java过程中积累的经验总结,旨在帮助初学者快速理解和掌握Java编程。 1. **Java基础** - **数据类型**: Java...

    多线程学习笔记.docx

    线程的优先级在不同的操作系统中有所不同,Java提供了10个级别的优先级,但并不保证优先级高的线程一定会先执行,因为线程调度策略由操作系统决定。在Java中,可以通过setPriority()方法设置线程的优先级,但在多...

    学习笔记多线程Unix编程

    在深入探讨多线程Unix编程之前,...学习笔记中的内容可能涵盖了以上各个知识点的实例、代码示例和解析,帮助你理解和实践多线程Unix编程。通过不断实践和学习,你将能够熟练地在Unix环境中编写高效的多线程应用程序。

Global site tag (gtag.js) - Google Analytics