线程睡眠:Thread.sleep()方法

当一个线程在运行中执行了sleep()方法,它就会放弃CPU,转到阻塞状态。下面对19.2.1节的例程19-4的Monkey类的fight()方法做如下修改,使小悟空线程每次打败一个敌人后,就休息500毫秒:[code]public void fight(){ /* 与敌人战斗 */
for(int i=1;i<=100;i++){
System.out.println(getName()+":打败第"+i+“个敌人”);

try{  
  sleep(500); //睡眠500毫秒  
}catch(InterruptedException e){  
  throw new RuntimeException(e);  
}  

}
} [/code]Thread类的sleep(long millis)方法是静态方法,millis参数设定睡眠的时间,以毫秒为单位。

再次运行19.2.1节的例程19-5的War类时,假定某一时刻m1线程获得CPU,开始执行一次for循环,当它执行sleep()方法时,就会放弃CPU并开始睡眠。接着m2线程获得CPU,开始执行一次for循环,当它执行sleep()方法时,就会放弃CPU并开始睡眠。接着m3线程获得CPU,开始执行一次for循环,当它执行sleep()方法时,就会放弃CPU并开始睡眠。假定此时m1线程已经结束睡眠,就会获得CPU,继续执行下一次for循环。

再次运行War程序,一种可能的打印结果如下:第1个小悟空:打败第1个敌人 第2个小悟空:打败第1个敌人 第3个小悟空:打败第1个敌人 第1个小悟空:打败第2个敌人 第2个小悟空:打败第2个敌人 第3个小悟空:打败第2个敌人 第1个小悟空:打败第3个敌人 第2个小悟空:打败第3个敌人 第3个小悟空:打败第3个敌人 …… 值得注意的是,当m1线程结束睡眠,首先转到就绪状态,假如此时CPU正被m2线程占用,那么m1线程不一定立即会运行,而是在可运行池中等待获得CPU。