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的优先级。