> 文档中心 > 线程优先级

线程优先级


线程优先级

  1. 线程调度
  • 线程有两种调度模型
  • 分时调度模型:所有线程轮流使用CPU的使用权,平均分配每个线程占用CPU的时间
  • 抢占式调度模型:优先让优先级高的线程使用CPU,如果线程优先级相同,那么会随机选择一个,优先级高的线程获取的CPU时间片相对多一些
  • Java使用的是抢占式调度模型
  1. 假如计算机只有一个CPU,那么,在某一时刻只能执行一条指令,线程只有得到CPU时间片,也就是使用权,才可以执行指令。所以说多线程程序的执行是有随机性,因为谁抢到CPU的使用权不一定的

  2. 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线程抢占的时间片效率高,但是不能绝对说明抢占时间片效率高则结果一定在前,那是不一定的!!但是要在次数比较多,或者多次运行的时候才能看到你想要的效果