多线程的优先级决定了线程获得cpu执行的机会。优先级越高,执行几率就越大。反之。Java中存在11个优先级,最高级别为0,为JVM的线程,应用程序不能设置这个优先级。
既然是执行几率高,那么就说明,优先级高的并不能百分百优先于优先级低的线程。
<!-- lang: java -->
public class TestThread implements Runnable {
// 启动线程
private void start(int _priority) {
Thread t = new Thread(this);
t.setPriority(_priority);
t.start();
}
@Override
public void run() {
// 消耗CPU计算,观察cpu繁忙时线程的执行顺序
for (int i = 0; i < 10000; i++) {
Math.hypot(Math.pow(924525789, i), Math.cos(i));
}
// 输出线程优先级
System.out.println(Thread.currentThread().getPriority());
}
public static void main(String[] args) {
for (int i = 0; i < 20; i++) {
new TestThread().start(i % 10 + 1);
}
}
}
执行上述结果发现: 1:并非严格按照线程优先级执行。只是优先级高的线程获得CPU的几率比较高。 2:优先级级别相差越大,运行几率差别就越明显。对于JAVA而言,JVM调用操作系统接口来设置优先级,事实上不同的操作系统的线程优先级也是不同的,windows有7个,Linux有140个,FreeBSD有255个(优先级总数,不同操作系统有不同的分类)。
java建议使用优先级常量,而不是从1到10的随机数字。MIN_PRIORITY NORM_PRIORITY MAX_PRIORITY,注意不要把优先级作为核心业务的必然条件,因此再开发时候尽量使用这三个优先级而不是使用数字,这样也可以保证在不同操作系统下优先级的表现基本相同。
如果优先级相同呢?那么基本由操作系统决定,基本上是FIFO原则(先进先出),但是也不能完全保证。