线程的优先级

每个线程都有一个优先级。优先级用1到10之间的数字表示。在大多数情况下,线程调度器根据线程的优先级进行调度(称为抢占式调度)。但是这不是有保证的,因为它取决于JVM规范选择的调度方式。请注意,不仅JVM,Java程序员还可以在Java程序中显式地为线程分配优先级。

设置器和获取器方法的线程优先级

让我们讨论线程优先级的设置器和获取器方法。

public final int getPriority(): java.lang.Thread.getPriority()方法返回给定线程的优先级。

public final void setPriority(int newPriority): java.lang.Thread.setPriority()方法将线程的优先级更新或分配给newPriority。如果值newPriority超出范围(1到10),则该方法会抛出IllegalArgumentException。

Thread类中定义了3个常量:

  1. public static int MIN_PRIORITY
  2. public static int NORM_PRIORITY
  3. public static int MAX_PRIORITY

线程的默认优先级是5(NORM_PRIORITY)。MIN_PRIORITY的值为1,MAX_PRIORITY的值为10。

线程优先级的示例:

文件名:ThreadPriorityExample.java

// 导入需要的类    
import java.lang.*;  
  
public class ThreadPriorityExample extends Thread   
{  
  
// 方法一  
// 每当线程调用 start() 方法时   
// run() 方法被调用    
public void run()  
{  
// 打印语句   
System.out.println("Inside the run() method");  
}  
  
//主要方法  
public static void main(String argvs[])  
{  
// 在 ThreadPriorityExample 类的帮助下创建线程  
ThreadPriorityExample th1 = new ThreadPriorityExample();  
ThreadPriorityExample th2 = new ThreadPriorityExample();  
ThreadPriorityExample th3 = new ThreadPriorityExample();  
  
// 我们没有提到线程的优先级。 
// 因此线程的优先级为5,默认值  
  
// 第一个线程 
// 显示线程的优先级    
// 使用 getPriority() 方法 
System.out.println("Priority of the thread th1 is : " + th1.getPriority());  
  
// 第二个线程    
// 显示线程的优先级    
System.out.println("Priority of the thread th2 is : " + th2.getPriority());  
  
// 第三个线程    
// // 显示线程的优先级   
System.out.println("Priority of the thread th2 is : " + th2.getPriority());  
  
// 设置以上线程的优先级  
// 传递整数参数   
th1.setPriority(6);  
th2.setPriority(3);  
th3.setPriority(9);  
  
// 6  
System.out.println("Priority of the thread th1 is : " + th1.getPriority());  
  
// 3  
System.out.println("Priority of the thread th2 is : " + th2.getPriority());  
  
// 9  
System.out.println("Priority of the thread th3 is : " + th3.getPriority());  
  
// 主线程  
  
// 显示当前执行线程的名称    
System.out.println("Currently Executing The Thread : " + Thread.currentThread().getName());  
  
System.out.println("Priority of the main thread is : " + Thread.currentThread().getPriority());  
  
// 主线程的优先级现在是10   
Thread.currentThread().setPriority(10);  
  
System.out.println("Priority of the main thread is : " + Thread.currentThread().getPriority());  
}  
}  

输出:

Priority of the thread th1 is : 5
Priority of the thread th2 is : 5
Priority of the thread th2 is : 5
Priority of the thread th1 is : 6
Priority of the thread th2 is : 3
Priority of the thread th3 is : 9
Currently Executing The Thread : main
Priority of the main thread is : 5
Priority of the main thread is : 10

我们知道,在线程执行时,优先级高的线程会优先于优先级低的线程。然而,还有其他情况下两个线程可能具有相同的优先级。所有关于线程的处理工作都由Java线程调度器完成。请参考以下示例,以了解如果两个线程具有相同优先级会发生什么。

文件名:ThreadPriorityExample1.java

//  导入 java.lang 包   
import java.lang.*;  
  
public class ThreadPriorityExample1 extends Thread   
{  
  
// 方法一   
// 每当线程调用 start() 方法时  
// run() 方法被调用    
public void run()  
{  
// 打印语句   
System.out.println("Inside the run() method");  
}  
  
  
// 主要方法   
public static void main(String argvs[])  
{  
  
// 现在,主线程的优先级设置为 7   
Thread.currentThread().setPriority(7);  
  
// 获取当前线程    
// 使用 currentThread() 方法   
  
// 显示主线程优先级   
// 使用 Thread 类的 getPriority() 方法   
System.out.println("Priority of the main thread is : " + Thread.currentThread().getPriority());  
  
// 通过创建 ThreadPriorityExample1 类的对象来创建线程   ThreadPriorityExample1  
ThreadPriorityExample1 th1 = new ThreadPriorityExample1();  
  
//  th1 线程是主线程的子线程   
// 因此,第 1 个线程也获得优先级 7   
  
// 显示当前线程的优先级  
System.out.println("Priority of the thread th1 is : " + th1.getPriority());  
}  
}  

输出:

Priority of the main thread is : 7
Priority of the thread th1 is : 7

说明:如果有两个具有相同优先级的线程,则无法预测哪个线程将有机会首先执行。执行取决于线程调度器的算法(先来先服务,循环调度等)。

IllegalArgumentException的示例

我们知道,如果方法getPriority()的参数newPriority的值超出范围(1到10),则会得到IllegalArgumentException。让我们通过一个示例来观察同样的情况。

文件名:IllegalArgumentException.java

// 导入 java.lang 包   
import java.lang.*;  
  
public class IllegalArgumentException extends Thread   
{  
  
//主要方法   
public static void main(String argvs[])  
{  
  
// 现在,主线程的优先级设置为 17,大于 10  
Thread.currentThread().setPriority(17);  
  
// 获取当前线程  
// 使用 currentThread() 方法    
  
//  显示主线程优先级  
// 使用 Thread 类的 getPriority() 方法   
System.out.println("Priority of the main thread is : " + Thread.currentThread().getPriority());  
  
}  
}  

当我们执行以上程序时,会得到以下异常:

Exception in thread "main" java.lang.IllegalArgumentException
    at java.base/java.lang.Thread.setPriority(Thread.java:1141)
    at IllegalArgumentException.main(IllegalArgumentException.java:12)

标签: java, Java面试题, Java下载, java教程, java技术, Java学习, Java学习教程, Java语言, Java开发, Java入门教程, Java进阶教程, Java高级教程, Java笔试题, Java编程思想