Java线程优先级设置(附带实例)
Java 线程的调度机制由 JVM 实现,假如有若干线程,你想让一些线程拥有更多的执行时间或者更少的执行时间,就可以通过设置线程优先级来实现。
所有处于就绪状态的线程都在一个队列中,每个线程都有自己的优先级,JVM 的线程调度器会根据优先级来决定各线程每次执行的时间和执行频率。
JVM 的线程调度器的调度策略决定了上层多线程的运行机制,每个线程的执行时间都由它分配管理。调度器将按照各线程的优先级对线程的执行时间进行分配,优先级越高的线程得到的 CPU 执行时间越长,执行频率可能越高。
Java 把线程优先级分成了 10 个级别,如果线程被创建时没有明确声明优先级则使用默认优先级。Java 定义了 Thread.MIN_PRIORITY、Thread.NORM_PRIORITY 和 Thread.MAX_PRIORITY 三个常量,分别代表最小优先级值(1)、默认优先级值(5)和最大优先级值(10)。
可以通过 setPriority() 方法和 getPriority() 方法来分别设置和获取线程的优先级值,使用很简单,代码如下所示:
我们能否在 Java 程序中通过优先级值的大小来控制线程的执行顺序呢?答案是不能。可以通过下面的代码来理解:
所有处于就绪状态的线程都在一个队列中,每个线程都有自己的优先级,JVM 的线程调度器会根据优先级来决定各线程每次执行的时间和执行频率。
JVM 的线程调度器的调度策略决定了上层多线程的运行机制,每个线程的执行时间都由它分配管理。调度器将按照各线程的优先级对线程的执行时间进行分配,优先级越高的线程得到的 CPU 执行时间越长,执行频率可能越高。
Java 把线程优先级分成了 10 个级别,如果线程被创建时没有明确声明优先级则使用默认优先级。Java 定义了 Thread.MIN_PRIORITY、Thread.NORM_PRIORITY 和 Thread.MAX_PRIORITY 三个常量,分别代表最小优先级值(1)、默认优先级值(5)和最大优先级值(10)。
public static final int MIN_PRIORITY = 1; public static final int NORM_PRIORITY = 5; public static final int MAX_PRIORITY = 10;
可以通过 setPriority() 方法和 getPriority() 方法来分别设置和获取线程的优先级值,使用很简单,代码如下所示:
public class ThreadPriorityTest { public static void main(String[] args) { Thread t = new MyThread(); t.setPriority(7); System.out.println("线程优先级为:" + t.getPriority()); t.setPriority(Thread.MAX_PRIORITY); System.out.println("线程优先级为:" + t.getPriority()); t.setPriority(Thread.MIN_PRIORITY); System.out.println("线程优先级为:" + t.getPriority()); } static class MyThread extends Thread { public void run() { System.out.println("执行"); } } }输出结果为:
线程优先级为:7
线程优先级为:10
线程优先级为:1
我们能否在 Java 程序中通过优先级值的大小来控制线程的执行顺序呢?答案是不能。可以通过下面的代码来理解:
public class ThreadPriorityTest { public static void main(String[] args) { Thread t = new MyThread(); t.setPriority(10); t.setName("线程一"); Thread t2 = new MyThread(); t2.setPriority(5); t2.setName("线程二"); t.start(); t2.start(); } static class MyThread extends Thread { public void run() { System.out.print(this.getName()); } } }程序中,一共创建了“线程一”和“线程二”两个线程,当启动执行两个线程时并不会因为哪个线程的优先级高就先执行它,可能先输出“线程一”,也可能先输出“线程二”。