`
silentlakeside
  • 浏览: 109038 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Java多线程 -- 线程的优先级

 
阅读更多

Java线程可以有优先级的设定,高优先级的线程比低优先级的线程有更高的几率得到执行(不完全正确,请参考下面的“线程优先级的问题“)。

优先级的取值

Java线程的优先级是一个整数,其取值范围是1 (Thread.MIN_PRIORITY ) - 10 (Thread.MAX_PRIORITY )。

 

Thread源代码里对NORM_PRIORITY (数值为5) 的注释是“线程默认的优先级”

   /**
     * The default priority that is assigned to a thread. 
     */
    public final static int NORM_PRIORITY = 5;
 

其实不然。默认的优先级是父线程的优先级。在init方法里,

	Thread parent = currentThread();
	this.priority = parent.getPriority();

 或许这么解释是因为Java程序的主线程(main方法)的优先级默认是为NORM_PRIORITY,这样不主动设定优先级的,后续创建的线程的优先级也都是NORM_PRIORITY了。

	public static void main(String[] args) {
		System.out.println(Thread.currentThread().getPriority());
	}

其执行结果是5。

设置优先级

可以通过setPriority方法(final的,不能被子类重载)更改优先级。优先级不能超出1-10的取值范围,否则抛出IllegalArgumentException。另外如果该线程已经属于一个线程组(ThreadGroup),该线程的优先级不能超过该线程组的优先级:

	if (newPriority > MAX_PRIORITY || newPriority < MIN_PRIORITY) {
	    throw new IllegalArgumentException();
	}
	if((g = getThreadGroup()) != null) {
	    if (newPriority > g.getMaxPriority()) {
		newPriority = g.getMaxPriority();
	    }
	    setPriority0(priority = newPriority);
        }
    }

 其中setPriority0是一个本地方法。

线程组的最大优先级

我们可以设定线程组的最大优先级,当创建属于该线程组的线程时该线程的优先级不能超过这个数。

 

线程组最大优先级的设定:

  • 系统线程组的最大优先级默认为Thread.MAX_PRIORITY
  • 创建线程组的时候其最大优先级默认为父线程组(如果未指定父线程组,则其父线程组默认为当前线程所属线程组)的最大优先级
  • 可以通过setMaxPriority更改最大优先级,但无法超过父线程组的最大优先级

setMaxPriority的问题:

  • 该方法只能更改本线程组及其子线程组(递归)的最大优先级。
  • 但不能影响已经创建的直接或间接属于该线程组的线程的优先级,也就是说,即使目前有一个子线程的优先级比新设定的线程组优先级大,也不会更改该子线程的优先级。只有当试图改变子线程的优先级或者创建新的子线程的时候,线程组的最大优先级才起作用。

线程优先级的问题

对于线程优先级,我们需要注意:

* Thread.setPriority()可能根本不做任何事情,这跟你的操作系统和虚拟机版本有关
* 线程优先级对于不同的线程调度器可能有不同的含义,可能并不是你直观的推测。特别地,优先级并不一定是指CPU的分享。在UNIX系统,优先级或多或少可以认为是CPU的分配,但Windows不是这样
* 线程的优先级通常是全局的和局部的优先级设定的组合。Java的setPriority()方法只应用于局部的优先级。换句话说,你不能在整个可能的范围 内设定优先级。(这通常是一种保护的方式,你大概不希望鼠标指针的线程或者处理音频数据的线程被其它随机的用户线程所抢占)
* 不同的系统有不同的线程优先级的取值范围,但是Java定义了10个级别(1-10)。这样就有可能出现几个线程在一个操作系统里有不同的优先级,在另外一个操作系统里却有相同的优先级(并因此可能有意想不到的行为)
* 操作系统可能(并通常这么做)根据线程的优先级给线程添加一些专有的行为(例如”only give a quantum boost if the priority is below X“)。这里再重复一次,优先级的定义有部分在不同系统间有差别。
* 大多数操作系统的线程调度器实际上执行的是在战略的角度上对线程的优先级做临时操作(例如当一个线程接收到它所等待的一个事件或者I/O),通常操作系统知道最多,试图手工控制优先级可能只会干扰这个系统。
* 你的应用程序通常不知道有哪些其它进程运行的线程,所以对于整个系统来说,变更一个线程的优先级所带来的影响是难于预测的。例如你可能发现,你有一个预期 为偶尔在后台运行的低优先级的线程几乎没有运行,原因是一个病毒监控程序在一个稍微高一点的优先级(但仍然低于普通的优先级)上运行,并且无法预计你程序 的性能,它会根据你的客户使用的防病毒程序不同而不同。

 

你可以参考Java优先级与各操作系统优先级之间的对应关系

实际编码注意事项

  • 不要假定高优先级的线程一定先于低优先级的线程执行,不要有逻辑依赖于线程优先级,否则可能产生意外结果
分享到:
评论
3 楼 hu_xuefeng 2016-05-23  
照这样说,这个优先级设置的方法有什么比较实用的场景呢?
2 楼 肥安娜 2013-02-19  
这样看来如果跨平台运行线程优先级就没有多大用处了啊???
1 楼 iamaxel 2011-10-31  
看来优先级并没有我主观YY的那么简单啊

相关推荐

    Java多线程-Thread类的常用结构及线程优先级

    Java多线程编程是开发高并发应用的基础,其中Thread类是实现多线程的核心类。本文将详细解析Thread类的常用结构以及线程优先级。 一、Thread类的常用结构 1. 线程中的构造器 - `Thread()`:创建一个没有指定名称...

    JAVA线程高级-线程按序交替执行

    在Java编程中,多线程是并发编程的重要组成部分,它允许程序同时执行多个任务,从而提高了系统的效率和响应性。然而,在某些场景下,我们可能需要控制线程的执行顺序,确保它们按照特定的顺序交替运行,这在并发编程...

    Java多线程-多线程相关概念

    Java多线程技术是编程中不可或缺的一部分,它允许程序在同一时间执行多个任务,从而提高效率和响应速度。本文将深入探讨多线程相关的概念。 首先,我们要了解程序、进程和线程的区别。程序是一组指令的集合,静态...

    Java多线程-多线程知识点总结和企业真题

    ### Java多线程知识点总结及企业真题解析 #### 一、知识点总结 ##### (1)多线程相关概念 1. **程序、进程和线程的区分**: - **程序**:为了完成特定的任务而编写的指令集合。它是静态的概念。 - **进程**:...

    Java多线程-线程的生命周期

    Java多线程中,线程的生命周期是编程中必须理解的重要概念。在JDK1.5之前,线程被划分为五个状态,分别是新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和死亡(Dead)。在JDK1.5及之后,线程的...

    Java多线程-JDK5.0新增线程创建方式

    ### Java多线程-JDK5.0新增线程创建方式 #### 一、新增方式1:实现Callable接口 ##### (1)介绍 自Java 5.0起,为提高线程管理的灵活性与效率,引入了`Callable`接口,这是一种全新的创建线程的方式。与传统的`...

    Java多线程编程总结

    Java线程:线程的调度-优先级 Java线程:线程的调度-让步 Java线程:线程的调度-合并 Java线程:线程的调度-守护线程 Java线程:线程的同步-同步方法 Java线程:线程的同步-同步块 Java线程:并发协作-生产者消费者...

    多线程优先级示例_赛马

    总的来说,理解和合理使用线程优先级对于优化多线程程序性能至关重要。在设计系统时,应尽量避免过分依赖优先级,而是利用其他并发控制机制,如同步、锁和条件变量,以确保程序的正确性和效率。同时,了解操作系统的...

    java多线程代码案例(创建线程,主线程,线程优先级,线程组,线程同步,线程间的通信)

    本文将深入探讨Java多线程中的关键知识点,包括创建线程、主线程、线程优先级、线程组、线程同步以及线程间的通信。 1. **创建线程** 在Java中,可以通过两种方式创建线程:继承`Thread`类或实现`Runnable`接口。...

    java基础--11.多线程-1

    2. 抢占式调度:Java虚拟机采用优先级调度,线程优先级高的先执行。但是,实际的调度策略可能依赖于JVM和操作系统。 六、线程池 Java的Executor框架提供了一种管理线程的方式——线程池。通过ThreadPoolExecutor...

    【IT十八掌徐培成】Java基础第09天-003.多线程优先级-eclipse-配置使用.zip

    本教程将深入讲解Java中的多线程以及如何在Eclipse集成开发环境中配置和使用多线程。 首先,我们要理解什么是线程。线程是操作系统分配CPU时间的基本单位,每个线程都有自己的程序计数器、寄存器和栈,它们共享同一...

    java多线程的讲解和实战

    Java多线程是Java编程中的重要概念,尤其在如今的多核处理器环境下,理解并熟练掌握多线程技术对于提高程序性能和响应速度至关重要。本资料详细讲解了Java多线程的原理,并提供了丰富的实战代码,非常适合Java初学者...

    java多线程编程-详细炒作例子

    ### Java多线程编程详解与实战案例 #### 理解多线程概念与Java内存模型 多线程,作为现代编程中的一项关键技术,允许在单一应用程序中并发执行多个指令流,每个这样的指令流被称为一个线程。在Java中,线程被视为...

    Java多线程-避免同步机制带来的死锁问题及用Lock锁解决线程安全问题

    ### Java多线程-避免同步机制带来的死锁问题及用Lock锁解决线程安全问题 #### 死锁 ##### 1. 说明 在多线程编程中,死锁是一种常见的问题,指的是两个或多个线程在执行过程中,因为竞争资源而造成的一种相互等待...

    JAVA多线程练习题答案。

    JAVA多线程练习题答案详解 在本文中,我们将对 JAVA 多线程练习题的答案进行详细的解释和分析。这些题目涵盖了 JAVA 多线程编程的基本概念和技术,包括线程的生命周期、线程同步、线程状态、线程优先级、线程安全等...

    java多线程Demo

    Java多线程是Java编程中的一个重要概念,它允许程序同时执行多个任务,提高了程序的效率和响应速度。在Java中,实现多线程有两种主要方式:继承Thread类和实现Runnable接口。 1. 继承Thread类: 当我们创建一个新...

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

    Java线程优先级是Java多线程编程中的一个重要概念,它用于控制线程的执行顺序。在Java中,线程的优先级可以帮助我们调整不同任务的执行优先级,以优化程序性能。本教程将深入讲解Java线程优先级的设置,并提供源代码...

    java 多线程编程实战指南(核心 + 设计模式 完整版)

    《Java多线程编程实战指南》这本书深入浅出地讲解了Java多线程的核心概念和实战技巧,分为核心篇和设计模式篇,旨在帮助开发者掌握并应用多线程技术。 1. **线程基础** - **线程的创建**:Java提供了两种创建线程...

    计算机后端-Java-Java核心基础-第19章 IDEA的使用与多线程 17. 线程优先级的设置.avi

    计算机后端-Java-Java核心基础-第19章 IDEA的使用与多线程 17. 线程优先级的设置.avi

    多线程优先级的示例演示

    在Java等支持线程的语言中,线程优先级一般有预定义的几个等级,例如Java中的`Thread.NORM_PRIORITY`(默认优先级)、`Thread.MAX_PRIORITY`(最高优先级)和`Thread.MIN_PRIORITY`(最低优先级)。开发者可以使用...

Global site tag (gtag.js) - Google Analytics