Java多线程(12)线程优先级

在操作系统中,线程可以划分优先级,优先级较高的线程得到的CPU资源较多,也就是CPU优先执行优先级较高的线程对象中的任务。

设置线程优先级有助于帮线程规划器确定在下一次选择哪一个线程来有限执行。

设置线程的优先级使用setPriority方法,现在查看一下源码:

Java多线程(12)线程优先级_第1张图片

在Java中,线程的优先级分为1到10这10个等级,如果小于1或者大于10,则JDK抛出异常IllegalArgumentException。

在JDK中使用3个变量来预置定义优先级的值,代码如下:

public final static int MIN_PRIORITY =1;

public final static int NORM_PRIORITY =5;

public final static int MAX_PRIORITY =10;






线程优先级的继承特性

在Java中,线程的优先级具有继承性,比如A线程启动B线程,则B线程的优先级与A线程一样。

例如:

Java多线程(12)线程优先级_第2张图片
Java多线程(12)线程优先级_第3张图片

将注释放开,运行结果如下:

Java多线程(12)线程优先级_第4张图片





优先级具有规则性

虽然使用setPriority方法可以设置线程的优先级,但还没有看到设置优先级所带来的效果。

例如

Java多线程(12)线程优先级_第5张图片
Java多线程(12)线程优先级_第6张图片
Java多线程(12)线程优先级_第7张图片

多次运行结果:

Java多线程(12)线程优先级_第8张图片

从打印结果可以发现,高优先级的线程总是大部分先执行完,但是不带表高优先级的线程全程先执行完。另外,不要以为MyThread1线程先被main线程所调用就会先执行完,出现这样的结果完全是因为MyThread1线程的优先级是最高值10所造成的。当线程优先级的等级差距很大时,谁先执行完和代码的调用顺序无关。为了验证,更新一下代码:

Java多线程(12)线程优先级_第9张图片

运行结果:

Java多线程(12)线程优先级_第10张图片

从运行结果可以发现,大部分的thread2先执行完,也验证了代码优先级与代码顺序无关,出现这样的结果是因为MyThread2的优先级是最高的,说明线程的优先级具有一定的规则性,也就是CPU尽量将执行资源让给优先级比较高的线程。





优先级具有随机性

上面介绍了线程优先级较高则优先执行完run方法中的任务,但是这个结果不能说的太肯定,因为线程的优先级还具有随机性,也就是高优先级的线程不一定每一次都先执行完。

例如:

Java多线程(12)线程优先级_第11张图片
Java多线程(12)线程优先级_第12张图片
Java多线程(12)线程优先级_第13张图片

为了体现随机性,所以两个线程的优先级一个设置为5一个设置为6,让优先级接近一些。下面贴出运行六次的结果:

Java多线程(12)线程优先级_第14张图片
Java多线程(12)线程优先级_第15张图片
Java多线程(12)线程优先级_第16张图片
Java多线程(12)线程优先级_第17张图片
Java多线程(12)线程优先级_第18张图片
Java多线程(12)线程优先级_第19张图片


那么,根据此实验,可以得出一个结论,不要把线程的优先级与运行结果的顺序作为衡量的标准,优先级较高的线程并不一定每一次都先执行完run方法中的任务,也就是说,线程优先级与打印顺序无关,不要将这两者的关系相关联,它们的关系具有不确定性和随机性。




看谁运行的快

看例子:

Java多线程(12)线程优先级_第20张图片
Java多线程(12)线程优先级_第21张图片
Java多线程(12)线程优先级_第22张图片

运行结果:

Java多线程(12)线程优先级_第23张图片

多次运行可以看到不同的结果。

你可能感兴趣的:(Java多线程(12)线程优先级)