在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先执行。为线程设置了更高的优先级,仅仅表示这个线程先执行的概率更大,而不表示这个线程就一定先执行。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。