1、概念:
当调用Thread.yield()函数时,会给线程调度器一个当前线程愿意让出CPU使用的暗示,但是线程调度器可能会忽略这个暗示。
2、实战。
看下面例子
public class yieldDemo { public static void main(String[] args) { Runnable yield = new Runnable() { @Override public void run() { for (int i = 0; i <= 10; i++) { System.out.println(Thread.currentThread().getName() + i); if (i == 5) { Thread.yield(); } } } }; Thread t1 = new Thread(yield,"A"); Thread t2 = new Thread(yield,"B"); t1.start(); t2.start(); } }
上面例子所示,两个线程,各循环10以内的数字,每当执行到5 时,就会给程序调度器一个暗示,表示可以让出线程。程序执行结果如下:
A0 A1 A2 A3 A4 A5 B0 B1 B2 B3 B4 B5 A6 A7 A8 A9 A10 B6 B7 B8 B9 B10 Process finished with exit code 0
可以多执行几次,可以看到每次执行结果,不一定是到5了让出资源,可能会一直执行下去,表示虽然给程序调度器暗示可以让出资源,但是资源调度器却忽略了这个暗示。
总结:
yield 和 sleep 的异同
1)yield, sleep 都能暂停当前线程,sleep 可以指定具体休眠的时间,而 yield 则依赖 CPU 的时间片划分。
2)yield, sleep 两个在暂停过程中,如已经持有锁,则都不会释放锁资源。
3)yield 不能被中断,而 sleep 则可以接受中断。