码迷,mamicode.com
首页 > 其他好文 > 详细

Thread.yield()方法

时间:2020-07-17 22:13:47      阅读:101      评论:0      收藏:0      [点我收藏+]

标签:ldd   jdk   public   产生   静态   com   相对   出现   java编程思想   

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()方法

标签:ldd   jdk   public   产生   静态   com   相对   出现   java编程思想   

原文地址:https://www.cnblogs.com/zhanghuaze/p/13332667.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!