首页 理论教育 线程的优先级

线程的优先级

时间:2022-02-28 理论教育 版权反馈
【摘要】:线程的优先级告诉调试程序该线程的重要程度有多大。若线程的优先级较低,只不过表示它被准许运行的机会小一些而已。现在试着再次提高优先级,可以升高回线程组的优先级,但不能比其更高了。现在将线程组的优先级降低两次。线程的优先级不会改变,但假若试图提高或者降低它,就会发现这个优先级自动变成线程组的优先级。此外,新线程仍然具有一个默认优先级,即使它比组的优先级还要高。

11.3.2 线程的优先级

在一个系统中可能存在多个线程,系统调度和分配CPU和资源会按照这些线程的优先级(Priority)进行。线程的优先级告诉调试程序该线程的重要程度有多大。如果有大量线程都被堵塞处于等候运行状态,调试程序会首先运行具有最高优先级的那个线程,这并不表示优先级较低的线程不会运行。若线程的优先级较低,只不过表示它被准许运行的机会小一些而已。

在Thread类中,提供了的优先级范围是1~10,其中1表示最小优先级,10表示最大优先级,5为默认值。为此,在Thread中定义3个优先级常量MAX_PRIORITY=10,MIN_PRI-

ORITY=1,NORMAL_PRIORITY=5,其中NORMAL为默认优先级。

在Java中为优先级获取和设定提供了相应的方法:

img651

如果优先级数超出了1~10的范围,即会产生IllegalArgumentExection异常。

【例11-4】 线程优先级举例,注意线程thread6的优先级被设置为0是错误的写法,注意异常处理。

img652

运行该程序时,我们可注意到,线程组的默认优先级是5。即使在启动线程之前(或者在创建线程之前,这要求对代码进行适当的修改)将最大优先级降到5以下。

最简单的测试是获取一个计数器,将它的优先级降低至1,此时应观察到它的计数频率显著放慢。现在试着再次提高优先级,可以升高回线程组的优先级,但不能比其更高了。现在将线程组的优先级降低两次。线程的优先级不会改变,但假若试图提高或者降低它,就会发现这个优先级自动变成线程组的优先级。此外,新线程仍然具有一个默认优先级,即使它比组的优先级还要高(换句话说,不要指望利用组优先级来防止新线程拥有比现有的更高的优先级)。【例11-5】 在例11-2中的main()方法中为3个累加线程添加优先级,如下:

img653

通过改变各线程优先级,可以发现,取得的数值将会产生变化。与例11-2运行结果对比,注意并不是每次都出现相同的这个结果。程序运行结果如下:

img654

模仿例11-5:利用多线程设计思想,设计同时开启10个线程对1~1 000进行计数,通过改变各线程的优先级,对比各线程获得数值的情况。

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

我要反馈