16.4.5 改变线程优先级
16.4.5 改变线程优先级
优先级的作用
每个线程执行时都具有一定的优先级,优先级高
的线程获得较多的执行机会
,而优先级低的线程则获得较少的执行机会。
默认优先级
每个线程默认的优先级都与创建它的父线程的优先级相同,在默认情况下,main
线程具有普通优先级,所以由main
线程创建的子线程也具有普通优先级。
优先级方法
Thread
类提供了setPriority
和getPriority
方法来设置和返回指定线程的优先级:
Thread 类方法 |
描述 |
---|---|
void setPriority(int newPriority) |
Changes the priority of this thread. |
int getPriority() |
Returns this thread’s priority. |
其中setPriority()
方法的参数可以是一个整数,范围是1-10
之间,也可以使用Thread
类提供的三个静态常量来设置优先级,如下所示:
MAX_PRIORITY
,其值是10
NORM_PRIORITY
,其值是5
。MIN_PRIORITY
,其值是1
程序 设置线程优先级
下面程序使用了setPriority()
方法来改变主线程的优先级,并使用该方法改变了两个线程的优先级,从而可以看到高优先级的线程将会获得更多的执行机会。
1 | public class PriorityTest extends Thread { |
上面程序中改变了主线程的优先级为6,这样由main
线程所创建的子线程的优先级默认都是6,所以程序直接输出low
、high
两个线程的优先级时应该看到6。
接着程序将low
线程的优先级设为Priority.MIN_PRIORITY
,将high
线程的优先级设置为Priority.MAX_PRIORITY
。
优先级级别需要操作系统支持
值得指出的是,虽然Java
提供了10个优先级级别,但这些优先级级别需要操作系统的支持
。
遗憾的是,不同操作系统上的优先级并不相同,而且也不能很好地和Java
的10个优先级对应,例如**Windows 2000
仅提供了7个优先级**。
应该尽量避免直接为线程指定优先级
因此应该尽量避免直接为线程指定优先级,而应该使用Thread.MAX_PRIORITY
、Thread.NORM_PRIORITY
、Thread.MIN_PRIORITY
三个静态常量来设置优先级,这样才可以保证程序具有最好的可移植性。