java线程礼让yield
1.yield方法
使用Thread类的静态方法yield可以对当前线程进行礼让,yield方法使线程从运行状态转换到就绪状态,
这与sleep方法对比,sleep是使线程从运行状态进入阻塞状态。
现在给出代码便于理解:
public class testyield implements Runnable{
public static void main(String[] args) {
// TODO Auto-generated method stub
new Thread(new testyield(),"test1").start();
new Thread(new testyield(),"test2").start();
}
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println(Thread.currentThread().getName()+"->start");
Thread.yield(); //进行礼让
System.out.println(Thread.currentThread().getName()+"->end");
}
}
运行结果如下:
1.
test1->start
test1->end
test2->start
test2->end
2.
test1->start
test2->start
test2->end
test1->end
从结果分析,可以得出线程的礼让不是一定成功的,因为一个线程test1调用yield()方法后从运行态到就绪态后,CPU再通过系统调度调度一个线程进入CPU,这个重新调入的线程也可能是线程test1的情况。所以线程使用yield方法不一定会成功礼让,因为yield方法只是单纯把当前线程从运行态切换为就绪态。最终操作系统通过系统调度,重新调度线程,至于调度哪个线程是操作系统的事。所以才会出现上面情况一。