在多线程环境中, 线程调度程序根据线程的优先级将处理器分配给线程。每当我们在Java中创建线程时, 始终会为其分配一些优先级。优先级可以由JVM在创建线程时给定, 也可以由程序员明确给定。
可接受的线程优先级值在1到10的范围内。Thread类中为优先级定义了3个静态变量。
公共静态int MIN_PRIORITY:
这是线程可以具有的最低优先级。值是1。
公共静态int NORM_PRIORITY:
如果未显式定义线程, 则这是线程的默认优先级。值是5。
公共静态整数MAX_PRIORITY:
【多线程中的Java线程优先级介绍和代码实例】这是线程的最大优先级。值是10。
获取和设置线程优先级:
- public final int getPriority():java.lang.Thread.getPriority()方法返回给定线程的优先级。
- public final void setPriority(int newPriority):java.lang.Thread.setPriority()方法将线程的优先级更改为值newPriority。如果参数newPriority的值超出最小(1)和最大(10)限制, 则此方法引发IllegalArgumentException。
// Java program to demonstrate getPriority() and setPriority()
import java.lang.*;
class ThreadDemo extends Thread
{
public void run()
{
System.out.println( "Inside run method" );
}public static void main(String[]args)
{
ThreadDemo t1 = new ThreadDemo();
ThreadDemo t2 = new ThreadDemo();
ThreadDemo t3 = new ThreadDemo();
System.out.println( "t1 thread priority : " +
t1.getPriority());
// Default 5
System.out.println( "t2 thread priority : " +
t2.getPriority());
// Default 5
System.out.println( "t3 thread priority : " +
t3.getPriority());
// Default 5t1.setPriority( 2 );
t2.setPriority( 5 );
t3.setPriority( 8 );
// t3.setPriority(21);
will throw IllegalArgumentException
System.out.println( "t1 thread priority : " +
t1.getPriority());
//2
System.out.println( "t2 thread priority : " +
t2.getPriority());
//5
System.out.println( "t3 thread priority : " +
t3.getPriority());
//8// Main thread
System.out.print(Thread.currentThread().getName());
System.out.println( "Main thread priority : "
+ Thread.currentThread().getPriority());
// Main thread priority is set to 10
Thread.currentThread().setPriority( 10 );
System.out.println( "Main thread priority : "
+ Thread.currentThread().getPriority());
}
}
Output:t1 thread priority : 5t2 thread priority : 5t3 thread priority : 5t1 thread priority : 2t2 thread priority : 5t3 thread priority : 8Main thread priority : 5Main thread priority : 10
注意:
具有最高优先级的线程将比其他线程先获得执行机会。假设存在3个线程t1, t2和t3, 它们的优先级分别为4、6和1。因此, 线程t2将首先根据最大优先级6执行, 然后执行t1, 然后执行t3。
主线程的默认优先级始终为5, 以后可以更改。所有其他线程的默认优先级取决于父线程的优先级。
例子:
// Java program to demonstrat ethat a child thread
// gets same priority as parent
import java.lang.*;
class ThreadDemo extends Thread
{
public void run()
{
System.out.println( "Inside run method" );
}public static void main(String[]args)
{
// main thread priority is 6 now
Thread.currentThread().setPriority( 6 );
System.out.println( "main thread priority : " +
Thread.currentThread().getPriority());
ThreadDemo t1 = new ThreadDemo();
// t1 thread is child of main thread
// so t1 thread will also have priority 6.
System.out.println( "t1 thread priority : "
+ t1.getPriority());
}
}
Output:Main thread priority : 6t1 thread priority : 6
如果两个线程具有相同的优先级, 那么我们就无法预期哪个线程将首先执行。这取决于线程调度程序的算法(Round-Robin, 先到先服务等)
如果我们使用线程优先级进行线程调度, 则应始终牢记底层平台应支持基于线程优先级的调度。
如果发现任何不正确的地方, 或者想分享有关上述主题的更多信息, 请写评论。
推荐阅读
- OOP编程(Java中的继承详细指南)
- 二叉树的枚举解析和算法实现原理
- mongodb进阶查询(投影查询、分页查询(limit和skip)以及查询sort排序)
- 超简单!mongodb文档(document)的增删改查命令行操作和图解
- mongodb数据建模分析、数据类型、增删数据库和集合操作
- mongodb环境部署(下载、安装和配置全解(Windows和Linux))
- 使用C++实现trie树(单词查找树,字典树)
- Python元组tuple使用详解
- Python数据结构之列表list用法和原理全解