您的位置 首页 java

“全栈2019”Java多线程第十一章:线程优先级详解

难度

初级

学习时间

10分钟

适合人群

零基础

开发语言

Java

开发环境

  • JDK v11
  • IntelliJ IDEA v2018.3

友情提示

  • 本教学属于系列教学,内容具有连贯性,本章使用到的内容之前教学中都有详细讲解。
  • 本章内容针对零基础或基础较差的同学比较友好,可能对于有基础的同学来说很简单,希望大家可以根据自己的实际情况选择继续看完或等待看下一篇文章。谢谢大家的谅解!

1.什么是 线程 优先级?

前面在 一章中讲了 如何暂时停止执行线程。

在 一章中又讲了 如何停止线程。

在 一章中讲了 如何让一个线程等待另一个线程执行完毕再执行

在 一章中讲了 如何让一个线程放弃执行权。

在 一章中讲了 如何判断一个线程是否存活

在 一章中讲了 线程的6种状态

现在我们来讲解 如何设置/获取线程的优先级

线程还有优先级?

对的,线程它有优先级。

优先级对线程有何影响?

优先级越高,获取执行权几率就越大。当然了,优先级高不代表百分百最先被执行。

优先级最低是几级?

1级。

优先级最高是几级?

10级。

如何获取线程的优先级?

通过线程的getPriority()方法可以获取线程的优先级。

如何设置线程的优先级?

通过线程的setPriority(int newPriority)方法可以设置线程的优先级。

下面,我们就分别来讲解这两个方法。

2.获取线程优先级getPriority()方法

在Thread类中,我们可以通过getPriority()方法来获取线程优先级。

getPriority()方法在Thread类中的源码:

将注释翻译成中文:

去掉注释版:

getPriority()方法的作用是获取线程优先级。

访问权限

public :getPriority()方法访问权限是公开的。

final :getPriority()方法是最终的。不能被子类重写。

int :getPriority()方法返回int类型的值。线程优先级。

getPriority()方法只能被对象调用。

参数

无。

抛出的异常

无。

应用

我们先来创建一个线程:

然后调用它的getPriority()方法:

运行程序,执行结果:

从运行结果来看,我们线程现在的优先级是5。

3.线程默认的优先级

线程默认的优先级是5。

从刚刚运行结果中也可以看得出来,刚刚被创建出来的线程,它的优先级就是5。

4.设置线程优先级setPriority(int newPriority)方法方法

在Thread类中,我们可以通过setPriority​(int newPriority)方法来设置线程优先级。

setPriority​(int newPriority)方法在Thread类中的源码:

将注释翻译成中文:

去掉注释版:

setPriority(int newPriority)方法的作用是设置线程优先级。

访问权限

public :setPriority​(int newPriority)方法访问权限是公开的。

final :setPriority​(int newPriority)方法是最终的。不能被子类重写。

void :setPriority​(int newPriority)方法无返回值。

setPriority(int newPriority)方法只能被对象调用。

参数

int newPriority :新线程优先级。

抛出的异常

无。

应用

我们先来创建一个线程:

然后调用它的setPriority​(int newPriority)方法来设置线程优先级:

接着调用它的getPriority()方法来获取线程优先级:

运行程序,执行结果:

从运行结果来看,我们的线程优先级是1。符合我们预期,我们程序中给线程设置的优先级就是1。

建议:

在启动线程之前设置线程优先级!

5.优先级最高的线程一定是最先执行?

优先级最高的线程不一定最先执行。

来看看实验就知道了。

演示:

请创建两个线程,其优先级为默认优先级,然后启动这两个线程,观察它们执行谁先谁后。

请观察程序代码及结果。

代码:

Main类:

结果(动图时长:13秒):

从多次运行结果来看,thread1线程和thread2线程它们的线程优先级都是5。

有时thread1线程先执行,有时thread2线程先执行。

好,接下来,我们把它们的线程优先级一个设置为最低优先级1,还有一个设置为最高优先级10,看看运行结果如何。

于是,我们来改写Main类:

运行程序,执行结果:

从运行结果来看,无论是拥有最高优先级的thread2线程还是拥有最低优先级的thread1线程,它们经过多次运行表明:拥有最高优先级的线程不一定先执行。

6.最低优先级、默认优先级、最高优先级

在Thread类中,有三个表示特殊优先级的常量:

将注释翻译成中文:

去掉注释版:

这三个常量分别是: MIN_PRIORITY NORM_PRIORITY MAX_PRIORITY

MIN_PRIORITY:值为1。表示最低优先级。

NORM_PRIORITY:值为5。表示默认优先级。

MAX_PRIORITY:值为10。表示最高优先级。

为什么要将这三个值定义为常量?

因为1、2、3、4、5这几个优先级设置起来,它们差别不明显,通俗来说就是你设置线程优先级为1或2,它们是没什么区别的,同理6、7、8、9、10也一样,所以我们干脆只用三个最常用的优先级1、5、10就好了。

应用

用线程优先级常量改写第5小节例子。

演示:

请创建两个线程,其优先级为默认优先级,然后启动这两个线程,观察它们执行谁先谁后。

请观察程序代码及结果。

代码:

Main类:

结果:

从运行结果来看,符合预期。结果和第5小节的结果预期一样。

总结

  • 线程优先级越高,获取执行权几率就越大。当然了,优先级高不代表百分百最先被执行。
  • 通过线程的getPriority()方法可以获取线程的优先级。
  • 通过线程的setPriority(int newPriority)方法可以设置线程的优先级。
  • 建议在启动线程之前设置线程优先级。
  • MIN_PRIORITY:值为1。表示最低优先级。
  • NORM_PRIORITY:值为5。表示默认优先级。
  • MAX_PRIORITY:值为10。表示最高优先级。

至此,Java中线程优先级相关内容讲解先告一段落,更多内容请持续关注。

答疑

如果大家有问题或想了解更多前沿技术,请在下方留言或评论,我会为大家解答。

上一章

下一章

“全栈2019”Java多线程第十二章:后台线程setDaemon()方法详解

学习小组

加入同步学习小组,共同交流与进步。

  • 方式一:关注头条号Gorhaf,私信“Java学习小组”。
  • 方式二:关注公众号Gorhaf,回复“Java学习小组”。

全栈工程师学习计划

关注我们,加入“全栈工程师学习计划”。

版权声明

原创不易,未经允许不得转载!

文章来源:智云一二三科技

文章标题:“全栈2019”Java多线程第十一章:线程优先级详解

文章地址:https://www.zhihuclub.com/181614.shtml

关于作者: 智云科技

热门文章

网站地图