文章参考《Java多线程编程核心》
线程优先级的特性:继承性,规则性,随机性
优先级的规则性
解释:当优先级高和优先级低的线程一起运行,cpu总是尽量把执行资源分配给优先级高的线程。下面我们来实验一下。
创建MyThread.java
public class MyThread 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("MyThread 使用时间"+(endTime-beginTime));
}
}
创建MyThread2.java
public class MyThread2 extends Thread {
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("MyThread2 使用时间"+(endTime-beginTime));
}
}
创建Run.java
public class Run {
public static void main(String arg[]){
for(int i=0;i<5;i++){
MyThread myThread=new MyThread();
myThread.setPriority(10);
myThread.start();
MyThread2 myThread2=new MyThread2();
myThread2.setPriority(1);
myThread2.start();
}
}
}
运行结果
结论:高优先级的线程大部分都系先执行完,当优先级相差很大时候,谁先执行完跟代码调用的顺序无关。
我们测试一下
public class Run {
public static void main(String arg[]){
for(int i=0;i<5;i++){
MyThread myThread=new MyThread();
myThread.setPriority(1);
myThread.start();
MyThread2 myThread2=new MyThread2();
myThread2.setPriority(10);
myThread2.start();
}
}
}
结果
结论:由此可以看出线程的执行顺序与,代码顺序无关,因为mythread2比mythread先执行
优先级的随机性
随机性:刚刚我们看到高优先级的线程总是优先执行run方法中的任务,但是这个不是决定的,一般只有在优先级相差较远的时候才能勉强成立。
让我们实验一下,修改Run.java代码
public class Run {
public static void main(String arg[]){
for(int i=0;i<5;i++){
MyThread myThread=new MyThread();
myThread.setPriority(5);
myThread.start();
MyThread2 myThread2=new MyThread2();
myThread2.setPriority(6);
myThread2.start();
}
}
}
结果:
结论:Mythread线程没有有限全部执行完,再到Mythread2,而是没有规律的交叉执行—即随机性。由此我们得出结论,线程中优先级较高得不一定先执行完run方法中得任务。优先级高只是cpu尽可能把资源交给它执行。