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时间片更多一些,相对执行到的机会更大,并不是一定先执行。

posted @   淡忘的江南  阅读(5166)  评论(1编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示