Java中的线程优先级示例

时间:2020-01-09 10:35:05  来源:igfitidea点击:

在多线程环境中,线程将获得CPU周期的顺序由线程调度程序确定,并且它使用线程优先级来确定该顺序。尽管这并不意味着低优先级线程永远不会有运行的机会,但是Java中的线程优先级不会导致死锁,但低优先级线程将获得更少的CPU周期。较高优先级的线程也可以抢占较低优先级的线程。

Java线程优先级

Java中的每个线程都有一个优先级分配给它。在Java中创建线程时,它将继承创建线程的优先级。我们可以在创建线程后随时使用Thread类的setPriority()方法更改其优先级。如果要检查线程的优先级,可以使用Thread类的getPriority()方法进行检查。

  • setPriority(int newPriority)–更改此线程的优先级。这里newPriority是将此线程设置为的优先级。如果优先级不在MIN_PRIORITY到MAX_PRIORITY范围内,则抛出IllegalArgumentException。
  • getPriority()–返回调用此方法的线程的优先级。

Java线程优先级的范围是1到10,其中1是Java中最低的线程优先级,而10是最高的线程优先级。

在Java Thread类中,有三个静态int字段,用于定义线程的最小,最大和默认优先级。

  • MAX_PRIORITY –线程可以具有的最大优先级。其值为10.
  • MIN_PRIORITY –线程可以具有的最低优先级。该字段的值为1.
  • NORM_PRIORITY –分配给线程的默认优先级。其值为5.

Java线程优先级示例

这是一个示例程序,显示了Java中的线程优先级。这里创建了三个线程,首先使用getPriority()方法显示这些线程的原始优先级,然后使用setPriority()方法更改优先级。

class NumThread implements Runnable{
  @Override
  public void run() {
    System.out.println("Priority of " + Thread.currentThread().getName() + " is " + Thread.currentThread().getPriority());
    for (int i = 0; i < 5; i++) {
      System.out.println(Thread.currentThread().getName() + " : " + i);
    } 
  }
}

public class ThreadPriority {
  public static void main(String[] args) {
    // Creating threads
    Thread t1 = new Thread(new NumThread(), "Thread-1");
    Thread t2 = new Thread(new NumThread(), "Thread-2");
    Thread t3 = new Thread(new NumThread(), "Thread-3");
    
    System.out.println("Original priority of Thread-1: " + t1.getPriority());
    System.out.println("Original priority of Thread-2: " + t2.getPriority());
    System.out.println("Original priority of Thread-3: " + t3.getPriority());
    // Changing thread's priority
    t1.setPriority(Thread.MIN_PRIORITY);
    t2.setPriority(3);
    t3.setPriority(Thread.MAX_PRIORITY);
    
    t1.start();
    t2.start(); 
    t3.start();
  }
}

输出:

Original priority of Thread-1: 5
Original priority of Thread-2: 5
Original priority of Thread-3: 5
Priority of Thread-3 is 10
Thread-3 : 0
Thread-3 : 1
Thread-3 : 2
Thread-3 : 3
Thread-3 : 4
Priority of Thread-2 is 3
Thread-2 : 0
Thread-2 : 1
Thread-2 : 2
Thread-2 : 3
Thread-2 : 4
Priority of Thread-1 is 1
Thread-1 : 0
Thread-1 : 1
Thread-1 : 2
Thread-1 : 3
Thread-1 : 4

我们可以在输出中看到,优先级最高的线程将首先执行。但这并非总是如此,由于运行Java的平台也可能会获得不同的输出,这也是因素之一,因为该平台对多任务的实现可能有所不同。

线程优先级取决于平台

运行Java的平台上的线程可能具有不同的优先级,从而导致优先级比Java中的线程优先级高或者低。在那种情况下,JVM尝试将Java线程优先级映射到OS的优先级。