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()方法介绍
C++之sleep/usleep/this_thread::yield/this_thread::sleep_for延时区别(一百四十)