线程优先级
线程优先级
- 线程调度
- 线程有两种调度模型
- 分时调度模型:所有线程轮流使用CPU的使用权,平均分配每个线程占用CPU的时间片
- 抢占式调度模型:优先让优先级高的线程使用CPU,如果线程优先级相同,那么会随机选择一个,优先级高的线程获取的CPU时间片相对多一些
- Java使用的是抢占式调度模型
-
假如计算机只有一个CPU,那么,在某一时刻只能执行一条指令,线程只有得到CPU时间片,也就是使用权,才可以执行指令。所以说多线程程序的执行是有随机性,因为谁抢到CPU的使用权不一定的
-
Thread类中设置和获取线程优先级的方法
- public final int getPriority();返回此线程的优先级
- public final void setPriority(int newPriority);更改此线程的优先级
- 线程默认优先级是5; 线程优先级的范围是:1-10;
- 线程优先级高仅仅表示线程获取cpu时间片的几率高,但是要在次数比较多,或者多次运行的时候才能看到你想要的效果
以图文和代码内容形式讲解
方式一(默认下)
MyThread类
package Demo;public class MyThread extends Thread { public MyThread() { } public MyThread(String name) { super(name); } public void run() { for (int i = 0; i < 100; i++) { System.out.println(getName()); } }}
Demo类(调用public final int getPriority();返回此线程的优先级)---------默认优先级
package Demo;public class Demo { public static void main(String[] args){ //建立MyThread类,并进行有参改各线程名字 MyThread my1 = new MyThread("菜徐琨"); MyThread my2 = new MyThread("鸡你太美"); MyThread my3 = new MyThread("篮球");// //启动线程// my1.start();// my2.start();// my3.start(); //利用public final int getPriority();返回此线程的优先级 注意是默认类型:5 System.out.println(my1.getPriority());//5 System.out.println(my2.getPriority());//5 System.out.println(my3.getPriority());//5// //调用run();方法// my1.run();// my2.run();// my3.run(); }}
此时结果不唯一,三者默认优先级都为5,所以抢占CPU时间片也是一样的
方式二(更改此线程的优先级)
MyThread类
package Demo;public class MyThread extends Thread { public MyThread() { } public MyThread(String name) { super(name); } public void run() { for (int i = 0; i < 100; i++) { System.out.println(getName()); } }}
Demo类(调用public final void setPriority(int newPriority);更改此线程的优先级)
package Demo;public class Demo { public static void main(String[] args){ //建立MyThread类,并进行有参改各线程名字 MyThread my1 = new MyThread("菜徐琨"); MyThread my2 = new MyThread("鸡你太美"); MyThread my3 = new MyThread("篮球"); //启动线程 my1.start(); my2.start(); my3.start(); //public final void setPriority(int newPriority);更改此线程的优先级 my1.setPriority(my1.MAX_PRIORITY);//10 my1.setPriority(my2.MIN_PRIORITY);//1 my1.setPriority(my3.NORM_PRIORITY);//5 //调用run();方法 my1.run(); my2.run(); my3.run(); }}
这仅仅说明my1线程抢占的时间片效率高,但是不能绝对说明抢占时间片效率高则结果一定在前,那是不一定的!!但是要在次数比较多,或者多次运行的时候才能看到你想要的效果