yield方法
操作系统是为每个线程分配一个时间片来占用CPU执行的,正常情况下只有占用CPU的线程使用完时间片后,线程调度器才会进行下一轮线程调度。如果线程在没有使用完时间片的情况下调用了Thread的yield方法,这个线程就会处于就绪状态,让出CPU的执行权。线程调度器就会重新从就绪队列里取一个优先级最高的线程执行。也有可能会取到刚刚让出CPU的线程。
代码理解
public class YieldTest implements Runnable {
YieldTest() {
Thread t = new Thread(this);
t.start();
}
public void run() {
for (int i =0 ;i<3;i++){
System.out.println(Thread.currentThread() + "YieldTest start . . ." + i);
if (i == 0) {
System.out.println(Thread.currentThread() + "YieldTest yield cpu");
Thread.yield();
}
}
System.out.println(Thread.currentThread() + "YieldTest is over");
}
public static void main(String[] args) {
new YieldTest();
new YieldTest();
}
}
这里启动了两个线程,在i=0的时候调用yield方法,从结果中可以看出,线程调用该方法后没有继续执行下去让出了执行权,因为只有两个线程所以马上又被调用了。
还有一点,线程让出执行权后,再次被调用,是不会重新开始执行的,而是紧接着之前的位置开始执行。