Thread.yield()方法

Posted zhanghuaze

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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时间片更多一些,相对执行到的机会更大,并不是一定先执行。

以上是关于Thread.yield()方法的主要内容,如果未能解决你的问题,请参考以下文章

线程相关的sleep()yield()wait()join()方法介绍

多线程 Thread.yield 方法到底有什么用?

Thread.yield()的简单理解

C++之sleep/usleep/this_thread::yield/this_thread::sleep_for延时区别(一百四十)

Thread.sleep( ) vs Thread.yield( )

JAVA中的多线程:线程的优先级和yield方法