上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会尽量将执行资源让给优先级比较高的线程。