相关文章:
这里我们再来了解下 yield() 方法的使用,但在日常的开发过程中,我们很少会用到该方法
一、举例说明
public class YieldDemo {
public static void main(String[] args) {
Runnable yieldTask = () -> {
for (int i = 0; i < 5; i++) {
String name = Thread.currentThread().getName();
System.out.println(name + " === " + i);
if ("A".equals(name) && i == 2) {
Thread.yield();
}
}
};
Thread t1 = new Thread(yieldTask, "A");
Thread t2 = new Thread(yieldTask, "B");
t1.start();
t2.start();
}
}
-
第一种结果
// B === 0 // A === 0 // A === 1 // A === 2 // B === 1 // B === 2 // B === 3 // B === 4 // A === 3 // A === 4
-
第二种结果
// A === 0 // B === 0 // B === 1 // A === 1 // B === 2 // B === 3 // B === 4 // A === 2 // A === 3 // A === 4
-
如上所示,当 i = 2 时,线程 A 调用了 yield() 方法,第一种结果,线程 B 执行了;第二种结果,线程 B 没有执行
-
也就是说调用 yield() 方法只是通知线程调度器愿意让出 CPU 使用权,但是可能会被线程调度器忽略,由当前线程继续执行
-
线程 A 和线程 B 是一起执行的,多试几次会有不同的结果
二、归纳总结
-
调用 yield() 方法,当前线程会给线程调度器一个愿意让出 CPU 使用权的暗示,但是线程调度器可能会忽略这个暗示
-
当我们觉得一个线程不是那么重要,或者优先级非常低,而且又害怕它会占用太多的 CPU 资源,那么可以在适当的时候调用 Thread.yield() 方法,给予其他重要线程更多的工作机会