线程优先级
线程有个优先级(Priority)属性, Java中线程的优先级用1~10整数表示, 数值越大表示优先级越高。默认的优先级是5,可以用方法 getPriority() 获取当前优先级。类似的,可以用setPriority()设置当前线程优先级, 值得注意的是setPriority()方法应该在线程启动前就进行设置。

另外,在一个线程中开启一个新的线程,则新开启的线程称为该线程的子线程,子线程优先级默认等于父线程的优先级。

下面做一个简单的测试:
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线程对于优先级的设定。所以还是不要过多地依赖优先级的设定,因为其有可能完全被忽略,存在较大的不确定性。

以上只是我个人的看法,仅供参考。若您发现了其中的错误,欢迎指出。
It's
欢迎访问本站,欢迎留言、分享、点赞。愿您阅读愉快!
*转载请注明出处,严禁非法转载。
https://www.devsong.org
QQ留言 邮箱留言
头像
引用:
取消回复
提交
涂鸦
涂鸦
热门