admin管理员组文章数量:1607452
线程的“优先权”(priority)能告诉调度程序其重要性如何。尽管处理器处理现有线程
集的顺序是不确定的,但是如果有许多线程被阻塞并在等待运行,那么调度程序将倾向于
让优先权最高的线程先执行。然而,这并不是意味着优先权较低的线程将得不到执行(也
就是说,优先权不会导致死锁)。优先级较低的线程仅仅是执行的频率较低。
下面的程序修改了SimpleThread.java,用以演示优先权。线程的优先权是通过使用
setPriority( )方法进行调整的。
//: c13:SimplePriorities.java
// Shows the use of thread priorities.
import com.bruceeckel.simpletest.*;
public class SimplePriorities extends Thread {
private static Test monitor = new Test();
private int countDown = 5;
private volatile double d = 0; // No optimization
public SimplePriorities(intpriority) {
setPriority(priority);
start();
}
public String toString() {
return super.toString() + ": " + countDown;
}
public void run() {
while(true){
// An expensive, interruptable operation:
for(inti = 1; i < 100000; i++)
d = d + (Math.PI + Math.E) / (double)i;
System.out.println(this);
if(--countDown == 0) return;
}
}
public static void main(String[] args) {
newSimplePriorities(Thread.MAX_PRIORITY);
for(inti = 0; i < 5; i++)
newSimplePriorities(Thread.MIN_PRIORITY);
monitor.expect(new String[] {
"Thread[Thread-1,10,main]: 5",
"Thread[Thread-1,10,main]: 4",
"Thread[Thread-1,10,main]: 3",
"Thread[Thread-1,10,main]: 2",
"Thread[Thread-1,10,main]: 1",
"Thread[Thread-2,1,main]: 5",
"Thread[Thread-2,1,main]: 4",
"Thread[Thread-2,1,main]: 3",
"Thread[Thread-2,1,main]: 2",
"Thread[Thread-2,1,main]: 1",
"Thread[Thread-3,1,main]: 5",
"Thread[Thread-4,1,main]: 5",
"Thread[Thread-5,1,main]: 5",
"Thread[Thread-6,1,main]: 5",
"Thread[Thread-3,1,main]: 4",
"Thread[Thread-4,1,main]: 4",
"Thread[Thread-5,1,main]: 4",
"Thread[Thread-6,1,main]: 4",
"Thread[Thread-3,1,main]: 3",
"Thread[Thread-4,1,main]: 3",
"Thread[Thread-5,1,main]: 3",
"Thread[Thread-6,1,main]: 3",
"Thread[Thread-3,1,main]: 2",
"Thread[Thread-4,1,main]: 2",
"Thread[Thread-5,1,main]: 2",
"Thread[Thread-6,1,main]: 2",
"Thread[Thread-4,1,main]: 1",
"Thread[Thread-3,1,main]: 1",
"Thread[Thread-6,1,main]: 1",
"Thread[Thread-5,1,main]: 1"
},Test.IGNORE_ORDER + Test.WAIT);
}
} ///:~
在这个版本中,toString()方法被重载,并在里面使用了Thread.toString()方法
来打印线程的名称(你可以通过构造器来自己设置这个名称;这里是自动生成的名称,如
Thread-1,Thread-2 等),线程的优先权,以及线程所属的“线程组”。因为线程是自标
识的,所以本例中没有使用threadNumber。重载的toString( )方法还打印了线程的倒
计数值。
你可以看到thread1 的优先权最高,其余线程的优先权被设为最低。
在run( )里,加入了 100,000次开销相当大的浮点运算,包括double类型的加法与除法。
变量d用volatile修饰,以确保不进行优化。如果没有加入这些运算的话,你就看不到设
置优先级的效果(试一试:把包含double运算的for循环注释掉)。有了这些运算,你就
能观察到thread1 被线程调度机制优先选择(至少在我的Windows 2000 机器上是这样)。
尽管向控制台打印也是开销大的操作,但在那种情况下看不出优先权的效果,因为向控制
台打印不能被中断(否则的话,在多线程情况下控制台显示就乱套了),而数学运算是可
以中断的。运算时间要足够长,这样线程调度机制才来得及进行改变,并注意到thread 1
的优先权,使其被优先选择。
对于已存在的线程,你可以用 getPriority()方法得到其优先权,也可以在任何时候使
用 setPriority( )方法更改其优先权(这并不局限于像 SimplePriorities.java里
那样在构造器中修改)。
尽管JDK有 10个优先级别,但它与多数操作系统都不能映射得很好。比如,Windows 2000
有 7 个优先级且不是固定的,所以这种映射关系也是不确定的(尽管Sun的Solaris有 231
个优先级)。唯一可移植的策略是当你调整优先级的时候,只使用MAX_PRIORITY,
NORM_PRIORITY,和MIN_PRIORITY三种级别。
版权声明:本文标题:线程的“优先权”(priority)介绍 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/xitong/1728518944a1161848.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论