sleep()方法,使当前正在执行的线程,放弃CPU,而睡眠指定的时间。
范例1:sleep。[code=java]package org.cxy.demo;
public class Demo extends Thread{
public Demo(String name){
super(name);
}
public static void main(String[] args) {
Demo t1 = new Demo("小猫");
Demo t2 = new Demo("小鸟");
t1.start();
t2.start();
}
public void run(){
try {
System.out.println(Thread.currentThread().getName()+"说:我要进行秒睡!");
Thread.sleep(2000);
System.out.println(Thread.currentThread().getName()+"说:睡了2秒醒了!");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}[/code]当一个线程睡眠的时候,CPU会转去为其他线程服务去,程序执行的结果:[code=java]小鸟说:我要进行秒睡!
小猫说:我要进行秒睡!
// 注意,此处会等待2秒。然后输出之后的两句。
小猫说:睡了2秒醒了!
小鸟说:睡了2秒醒了![/code]因此,可以使用sleep方法,来完成线程间的切换(调度)。若在run方法中,没有使用Thread.sleep()方法,那么程序的执行结果,可能是这样的:[code=java]小猫说:我要进行秒睡!
小猫说:睡了2秒醒了!
小鸟说:我要进行秒睡!
小鸟说:睡了2秒醒了![/code]此时,这四句话的,被说出的顺序,就不太确定了。除了能保证“小猫说:我要进行秒睡!”将在“小猫说:睡了2秒醒了!”之前被打印出来,“小鸟说:我要进行秒睡!”在“小鸟说:睡了2秒醒了!”之前被打印出来,之外,其他的无法保证。
yield(),即线程让步。
范例2:yield。[code=java]package org.cxy.demo;
public class Demo extends Thread{
public Demo(String name){
super(name);
}
public static void main(String[] args) {
Demo t1 = new Demo("小猫");
Demo t2 = new Demo("小鸟");
t1.start();
t2.start();
}
public void run(){
System.out.println(Thread.currentThread().getName()+"说:我要进行秒睡!");
Thread.currentThread().yield();
System.out.println(Thread.currentThread().getName()+"说:睡了2秒醒了!");
}
}[/code]• 使用Thread类的静态方法yield() 进行让步操作。
• yield()方法使当前线程放弃本次抢到的CPU,回到就绪状态。从而使其他线程可以运行。但此方法同样没有任何保障。让步的线程可能再次被选中。
• 此方法不能保证做太多的事,尽管通常它会使当前线程回到就绪状态,并使具有相同优先级的线程能够有机会运行。
• 强烈提示:如果你的一些高优先级的线程很少发生阻塞,那么你的低优先级的线程可能永远都运行不了。
因此,他们二人都可以使线程放弃当前的cpu。 sleep可以让线程在放弃cpu后,有一段时间内不能参与cpu的竞争。而yield方法,仅仅是进行简单的线程让步,但是让步的线程可能再次被选中。
另外,提示一下,当在同步方法中,使某个线程调用了sleep方法,则该线程不会释放锁。
[ 本帖最后由 崔虎 于 2011-07-27 08:37 编辑 ] |