《Java多线程编程核心技术(第2版)》 —1.14.2 优先级的规律性
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尽量将执行资源让给优先级比较高的线程。
- 点赞
- 收藏
- 关注作者
评论(0)