本文内容大多基于官方文档和网上前辈经验总结,经过个人实践加以整理积累,仅供参考。
yield()
方法是 java.lang.Thread
类的一个静态方法,方法签名如下
public static void yield()
yield 字面意思是“屈服、妥协、让步”,因此 yield()
方法会让人误解为线程让步,终止当前线程的执行让给其他线程。实际上 yield() 方法只是将当前线程从运行状态切换到可运行状态,CPU会在 N 多可运行状态的线程中挑选
关于 yield()
方法需要注意以下几点:
1 通知当前线程从正在运行状态切换到可运行状态,不是等待或阻塞状态,将运行机会交给线程池中拥有相同优先级的线程
2 不能保证当前正在运行的线程能够迅速切换到可运行状态
3 不能保证 CPU 在线程池中挑选相同优先级线程时一定选择其他线程,也有可能 yield 线程再次被 CPU 选中运行
4 不能保证优先级高的线程一定能抢占运行,只会在概率上大一些
5 仅能使一个线程从运行状态切换到可运行状态
示例:
class YieldThread extends Thread {
public YieldThread(String name) {
super(name);
}
@Override
public void run() {
for (int i = 1; i <= 100; i++) {
System.out.println(this.getName() + " : " + i);
if (i == 50) {
Thread.yield();
}
}
}
}
public static void main(String[] args) {
Thread t1 = new YieldThread("A");
Thread t2 = new YieldThread("B");
t1.start();
t2.start();
}
从线程定义中可以看出,在循环到第 50 次时调用 Thread.yield()
,实际可能出现不同的运行结果:
第一种情况,线程 A 成功将 CPU 运行时间让出给线程 B 运行
第二种情况,线程 A 让出 CPU 运行时间,CPU 在相同优先级线程中再次选中线程 A 运行