另外,在一个线程中开启一个新的线程,则新开启的线程称为该线程的子线程,子线程优先级默认等于父线程的优先级。
下面做一个简单的测试:
package org.devsong.test;
public class PriorityTest {
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(new MyRunnable("A"));
Thread t2 = new Thread(new MyRunnable("B"));
Thread t3 = new Thread(new MyRunnable("C"));
Thread t4 = new Thread(new MyRunnable("D"));
Thread t5 = new Thread(new MyRunnable("E"));
t1.setPriority(1); //设置t1的优先级为 1, 即最低等级
t2.setPriority(10); //设置t2的优先级为最高等级 10
t1.start();
t2.start();
t3.start(); //其余保持默认值 5
t4.start();
t5.start();
}
}
class MyRunnable implements Runnable{
private String str;
public MyRunnable(String str) {
this.str = str;
}
@Override
public void run() {
int i = 0;
while(i++ < 50) {
System.out.print(str);
}
}
}
其中某次执行结果如下:
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDDDDDDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEECCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
结果可能比较有迷惑性,并没有如我们期待的B大量出现在最前面。那么分析应该是当前示例代码run方法内的逻辑比较简单,执行较快,很少存在多个线程互相抢占CPU资源的情况, 所以输出了以上结果。更重要的一点是查阅了一些资料发现,优先级设定并不是我们想象中的这种直观的结果展示,系统可能根据当前情况做一些调整,甚至直接忽略当前用户设置的优先级,而且不同的系统不同的环境可能还存在非常大的差异。另外,在网上找到了一句话,是《JAVA并发编程基础》里面的(我并没有看过这本书, 此处做个引用)。里面写到:线程优先级不能作为程序正确性的依赖,因为操作系统可以完全不用理会JAVA线程对于优先级的设定。所以还是不要过多地依赖优先级的设定,因为其有可能完全被忽略,存在较大的不确定性。
以上只是我个人的看法,仅供参考。若您发现了其中的错误,欢迎指出。