概述
14.0、Java多线程——线程的优先级
Java提供一个线程调度器来监控程序中启动后进入就绪状态的所有线程,线程调度器按照优先级决定应该调度那个线程来执行,线程的优先级用数字来表示,范围从 1~10 :
在Thread类原码中 他设置了三个优先级常量,如下所示:
Thread.MIN_PRIORITY = 1;
Thread.MAX_PRIORITY = 10;
Thread.NORM_PRIORITY = 5;
注意:
线程的优先级越高则权重越大,越能够被CPU优先调度,但是也不是百分之百,因为优先级低只是意味着获得调度的概率低,并不是优先级低就不会被调用了,这都是要看CPU的调度情况了
使用以下方式 改变 或 获取 优先级 :
getPriority() setPriority(int xxx);
通过查看原码可以知道 -> setPriority() 方法中会判断如果设置的优先级低于 1 或者超过 10 会报出异常。
main主函数的 默认优先级是 5
下面我们来看看用代码来如何测试,测试代码如下所示:
package com.hkl.state;
public class TestPriority {
public static void main(String[] args) {
//输出主函数的默认优先级->5
System.out.println(Thread.currentThread().getName()+"->"+Thread.currentThread().getPriority());
MyPriority myPriority = new MyPriority();
Thread t1 = new Thread(myPriority,"t1");
Thread t2 = new Thread(myPriority,"t2");
Thread t3 = new Thread(myPriority,"t3");
Thread t4 = new Thread(myPriority,"t4");
Thread t5 = new Thread(myPriority,"t5");
Thread t6 = new Thread(myPriority,"t6");
t1.start();
t2.setPriority(1);
t2.start();
t3.setPriority(5);
t3.start();
t4.setPriority(Thread.MAX_PRIORITY);
t4.start();
t5.setPriority(-1);
t5.start();
t6.setPriority(11);
t6.start();
}
}
class MyPriority implements Runnable {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"的优先级--->"+Thread.currentThread().getPriority());
}
}
上面代码中我们在 run() 方法中输出每条线程的优先级,必须在每条线程进入就绪状态之前设置优先级,否则进入就绪之后再设置将不起作用,如果不给线程设置优先级则默认为 5 级
后台的运行结果,如下所示:
可以看到图中报有异常,就是设置优先级的时候越界了->上面代码中设置了-1 和 11优先级。
可以看到 t1 虽然设置的优先级为 5,t4 的优先级为 10,但是由于CPU先行调度了 t1 线程所以尽管 t4 优先级高于 t1,却是 t1 先执行
最后
以上就是想人陪心锁为你收集整理的14.0、Java多线程——线程的优先级的全部内容,希望文章能够帮你解决14.0、Java多线程——线程的优先级所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复