理论教育 Java程序设计:线程优先级教程

Java程序设计:线程优先级教程

时间:2023-10-18 理论教育 版权反馈
【摘要】:在12.4.3小节线程让步中提到了线程优先级的概念,下面将对线程的优先级以及修改线程优先级的方法进行介绍。每个线程都具有各自的优先级,优先级用于表示线程的重要性和迫切性。表12.5表示线程优先级的静态常量线程的优先级默认为NORM_PRIORITY,但这并不是固定不变的。图12.15的程序运行结果中,线程2的优先级为10,先执行完毕之后,线程1才开始执行。

Java程序设计:线程优先级教程

在12.4.3小节线程让步中提到了线程优先级的概念,下面将对线程的优先级以及修改线程优先级的方法进行介绍。

在计算机中,某个线程需要执行就必须要得到CPU的使用权,而计算机会按照特定的机制为这些线程分配CPU的使用权。通常情况下,计算机的线程调度模式有时间片轮转、短任务优先以及优先级高优先等,其中优先级高优先就需要根据线程的优先级来决定线程的调度顺序。

每个线程都具有各自的优先级,优先级用于表示线程的重要性和迫切性。当有很多线程都处于就绪状态时,优先级越高的线程获得CPU使用权的概率就越大,而优先级越低的线程获得CPU使用权的概率就越小,例如JVM中垃圾回收线程的优先级就比较低。

线程的优先级可以使用1到10的整数来表示,数字越大表示优先级越高,优先级不能超过10,也不能小于1。每个新产生的线程默认优先级为5,如果父线程已经设定了优先级,那么子线程会继承父线程的优先级。除了直接使用数字来表示线程的优先级,Thread类中也提供了一些静态常量来表示线程的优先级,如表12.5所示。

表12.5 表示线程优先级的静态常量

线程的优先级默认为NORM_PRIORITY,但这并不是固定不变的。线程的优先级可以通过Thread类的public final void setPriority(int newPriority)方法来更改当前线程的优先级,该方法的参数newPriority为要设置的新的优先级,参数值必须是1到10的整数或表12.5中的静态常量,如果优先级不在MIN_PRIORITY到MAX_PRIORITY 之间,则抛出IllegalArgument Exception异常。另外,线程的优先级可以使用public final int getPriority()方法获得。

【例12.8】创建一个自定义线程MyThread,该线程执行for循环输出1到5。main线程中创建MyThread线程的实例thread1和thread2,然后将线程thread1的优先级设置为1,线程thread2的优先级设置为2,启动两个线程,查看控制台输出。

在cn.pzhu.op包下创建一个名为ThreadPriority的类,关键代码如下:(www.daowen.com)

运行上述代码,程序运行结果如图12.15所示。

图12.15 程序运行结果

ThreadPriority.java的main()方法中创建了两个线程thread1和thread2,然后分别将线程thread1的优先级设置为1,线程thread2的优先级设置为10。由于优先级越高的线程获得CPU使用权概率越大,所以线程thread2优先执行的概率越大。图12.15的程序运行结果中,线程2的优先级为10,先执行完毕之后,线程1才开始执行。

说明:

程序的输出结果并不是固定的,并不总是线程2先执行。为线程设置了更高的优先级,仅仅表示这个线程先执行的概率更大,而不表示这个线程就一定先执行。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈