线程的“优先权”(priority)介绍

线程的“优先权”(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三种级别。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值