Java多线程编程核心技术(第3版)
上QQ阅读APP看书,第一时间看更新

1.14.2 线程优先级的规律性

虽然使用setPriority()方法可以设置线程的优先级,但还没有看到设置优先级所带来的效果。

创建名称为t19的项目,文件MyThread1.java代码如下:


package extthread;

import java.util.Random;

public class MyThread1 extends Thread {
@Override
public void run() {
    long beginTime = System.currentTimeMillis();
    long addResult = 0;
    for (int j = 0; j < 10; j++) {
        for (int i = 0; i < 50000; i++) {
            Random random = new Random();
            random.nextInt();
            addResult = addResult + i;
        }
    }
    long endTime = System.currentTimeMillis();
    System.out.println("★★★★★thread 1 use time=" + (endTime - beginTime));
}
}

文件MyThread2.java代码如下:


package extthread;

import java.util.Random;

public class MyThread2 extends Thread {
@Override
public void run() {
    long beginTime = System.currentTimeMillis();
    long addResult = 0;
    for (int j = 0; j < 10; j++) {
        for (int i = 0; i < 50000; i++) {
            Random random = new Random();
            random.nextInt();
            addResult = addResult + i;
        }
    }
    long endTime = System.currentTimeMillis();
    System.out.println("☆☆☆☆☆thread 2 use time=" + (endTime - beginTime));
}
}

文件Run.java代码如下:


package test;

import extthread.MyThread1;
import extthread.MyThread2;

public class Run {
public static void main(String[] args) {
    for (int i = 0; i < 5; i++) {
        MyThread1 thread1 = new MyThread1();
        thread1.setPriority(10);
        thread1.start();

        MyThread2 thread2 = new MyThread2();
        thread2.setPriority(1);
        thread2.start();
    }
}
}

文件Run.java运行3次后输出的结果如图1-64所示。

图1-64 高优先级的线程总是先执行完

从图1-64中可以发现,高优先级的线程总是大部分先执行完,但不代表高优先级的线程全部先执行完。另外,并不是MyThread1线程先被main线程调用就先执行完,出现这样的结果是因为MyThread1线程的优先级是最高级别10。当线程优先级的等级差距很大时,谁先执行完和代码的调用顺序无关。为了验证这个结论,继续实验,改变Run.java代码如下:


public class Run {
public static void main(String[] args) {
    for (int i = 0; i < 5; i++) {
        MyThread1 thread1 = new MyThread1();
        thread1.setPriority(1);
        thread1.start();

        MyThread2 thread2 = new MyThread2();
        thread2.setPriority(10);
        thread2.start();
    }
}
}

文件Run.java在运行3次后输出的结果如图1-65所示。

图1-65 大部分thread2先执行完

从图1-65中可以发现,大部分thread2先执行完,也就验证线程的优先级与代码执行顺序无关,出现这样的结果是因为MyThread2的优先级是最高的,说明线程的优先级具有一定规律性,也就是CPU会尽量将执行资源让给优先级比较高的线程。