一、线程优先级概述
Java中的线程可以有自己的优先级。优先级高的线程在竞争资源时会更有优势,更有可能抢占到资源而优先被执行。当然这也只是一个概率问题,并不是一定就是这样。如果运气不好,那高优先级的线程可能也会抢占资源失败。
线程的优先级调度和底层操作系统有密切关系,在各个平台上表现不一,并且这种优先级产生的后果也可能容易预测,无法精准控制。比如一个低优先级的线程可能一直抢占不到资源,从而始终无法运行,而产生饥饿(虽然优先级低,但是也不能饿死它)。因此在要求严格的场全,还是需要自己在应用层解决程序调度问题。
在Java中,使用1到10表示优先级。一般可以使用Thread类内置的三个静态标量表示,下面的是从Thread类中截图的。
数字越大则优先级越高,但有效范围是1到10。线程优先级高的线程倾向于更快的完成任务。下面通过实例来说明线程的优先级。
package com.ethan.concurrent;
/**
* @ClassName PriorityDemo.java
* @Description 线程优先级示例
* @Author Ethan
* @Version 1.0
*/
public class PriorityDemo {
public static void main (String[] args) {
Thread highThread = new HighPriority();
LowPriority lowThread = new LowPriority();
highThread.setPriority(Thread.MAX_PRIORITY);
lowThread.setPriority(Thread.MIN_PRIORITY);
lowThread.start();
highThread.start();
}
/**
* @Description 优先级高的线程类
* @Author Ethan
* @Param
* @return
* @change: time: author: description:
*/
public static class HighPriority extends Thread {
static int count = 0;
@Override
public void run () {
while (true) {
synchronized (PriorityDemo.class) {
count ++;
if (count > 10000000) {
System.out.println("------------HighPriority is complete!---------------");
break;
}
}
}
}
}
/**
* @Description 优先级低的线程类
* @Author Ethan
* @Param
* @return
* @change: time: author: description:
*/
public static class LowPriority extends Thread {
static int count = 0;
@Override
public void run () {
while (true) {
synchronized (PriorityDemo.class) {
count ++;
if (count > 10000000) {
System.out.println("------------LowPriority is complete!---------------");
break;
}
}
}
}
}
}
打印结果如下所示,从结果可以看出,线程优先级高的先执行完成。但需要注意的是,在有很多线程的情况下,优先级高的线程会先执行完,但不一定是优先级高的线程都是全部先执行完。
二、特性
2,1 继承性
若线程A启动了线程B,那么B线程的优先级与A线程是一样的。
2,2 规则性
使用setPriority()方法设置线程的优先级后,线程会按照优先级的大小先后执行,但不一定就是优先级高的线程先执行完。如果打印出线程的优先级,打印的顺序并不一定是代码的顺序,因为前面的代码优先级可能没有后面线程的优先级高,因此前面的线程可能会后面执行。
2,3 随机性
优先级高的线程不一定是每一次都先执行完。
三、总结
线程的优先级调度和底层操作系统有密切关系,在各个平台上表现不一,并且这种优先级产生的后果也可能容易预测,无法精准控制。比如一个低优先级的线程可能一直抢占不到资源,从而始终无法运行,而产生饥饿(虽然优先级低,但是也不能饿死它)。因此在要求严格的场全,还是需要自己在应用层解决程序调度问题。
注:以上内容参考《实战Java高并发程序设计(第2版)》与《Java多线程编程核心技术》。