Thread.yield()方法
Thread.yield()方法是Thread类中的静态方法,直接由类名调用。
yield表示让步、放弃的意思。
-
Thread.yield() 方法,使当前线程由执行状态,变成为就绪状态,让出CPU,在下一个线程执行时候,此线程有可能被执行,也有可能没有被执行。
-
《Java编程思想》中这样描述:Thread,yield()方法的调用,是对线程调度器(Java线程计制的一部分,可以将CPU从一个线程转移到另一个线程)的建议,它在声明:“我已经执行完生命周期中最重要的部分了,此刻正是切换给其他任务执行一段时间的大好时机。”这完全是选择性的。
-
《JDK11中文手册》中这样描述:向调度程序提示当前线程愿意让出其当前使用的处理器。 调度程序可以忽略此提示。
Yield是一种启发式尝试,用于改善线程之间的相对进展,否则会过度利用CPU。 它的使用应与详细的分析和基准测试相结合,以确保它实际上具有所需的效果。
使用此方法很少合适。 它可能对调试或测试目的很有用,它可能有助于重现因竞争条件而产生的错误。 在设计并发控制结构(例如java.util.concurrent.locks
包中的结构)时,它也可能很有用。
class YieldThread implements Runnable { public void run() { for (int i = 0; i < 5; i++) { System.out.println(Thread.currentThread().getName() + "-" + i); if (i == 3) { Thread.yield(); } } } } public class YieldDemo { public static void main(String[] args) { YieldThread yThield = new YieldThread(); new Thread(yThield,"A").start(); new Thread(yThield,"B").start(); } }
- 根据运行情况得出结论:
通过对比使用Thread.yield()方法和未使用的运行结果,可以发现使用yield()方法后,很大概率上出现让出CPU给其它线程执行的情况。
1 class YieldThread implements Runnable { 2 public void run() { 3 for (int i = 0; i < 5; i++) { 4 System.out.println(Thread.currentThread().getName() + "-" + i); 5 if (i == 3) { 6 Thread.yield(); 7 } 8 } 9 } 10 } 11 public class YieldDemo { 12 public static void main(String[] args) { 13 YieldThread yThield = new YieldThread(); 14 Thread t1 = new Thread(yThield,"t1"); 15 Thread t2 = new Thread(yThield,"t2"); 16 t1.setPriority(1); 17 t2.setPriority(10); 18 System.out.println("t1.getPriority()"+t1.getPriority()); 19 System.out.println("t2.getPriority()"+t2.getPriority()); 20 t1.start(); 21 t2.start(); 22 } 23 }
-
根据运行情况得出结论:
实际运行中发现,Thread.yield()方法并不是仅仅选择让步于同等或者更高优先级的线程。高优先级的线程也会让步与低优先级的线程。因此高优先级仅仅是线程获得的CPU时间片更多一些,相对执行到的机会更大,并不是一定先执行。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)