yiled 方法属于一种启发式的方法,它会提醒调度器我愿意放弃当前的 CPU 自由,如果 CPU 的资源不紧张,则会忽略这种提醒。
调用 yield 方法会使当前线程从 RUNNING 状态切换到 RUNNABLE 状态,一般这个方法不太常用。
二 实战 1 代码package concurrent;import java.util.stream.IntStream;public class ThreadYield { public static void main(String[] args) { IntStream.range(0, 2).mapToObj(ThreadYield::create).forEach(Thread::start); } private static Thread create(int index) { return new Thread(() -> {// if (index == 0) {// Thread.yield();// } System.out.println(index); }); }}
2 测试上面的程序运行很多次,会发现输出结果不一致,有时候是打印0,有时候是打印1。
打开注释后再运行,会发现输出结果还是不一致,有时候是打印0,有时候是打印1。
3 说明一般情况下,因为第一个线程如果先获得了 CPU 资源,它会比较谦虚,主动告诉 CPU 调度器释放原本属于自己的资源,但是 yield 只是一个提示( hint ),CPU 调度器并不会保证每次都能满足 yield 提示。
yield 对程序并不可控,所以这个方法一般不太常用。
三 yield 和 sleep 的对比sleep 会导致当前线程暂停指定的时间,没有 CPU 时间片的消耗。yield 只是对 CPU 调度器的一个提示,如果 CPU 调度器没有忽略这个提示,它会导致线程上下文的切换。sleep 会使线程短暂 block,会在指定的时间内释放 CPU 资源。yield 会使 RUNNING 状态的 Thread 进入 RUNNABLE 状态(如果 CPU 调度器没有忽略这个提示的话)sleep 几乎百分之百地完成给定时间的休眠,而 yield 的提示并不能一定担保。一个线程 sleep 另一个线程调用 interrupt 会捕获到中断信号,而 yield 则不会。