(一)java yield()方法注释:

/*** A hint to the scheduler that the current thread is willing to yield* its current use of a processor. The scheduler is free to ignore this* hint.** <p> Yield is a heuristic attempt to improve relative progression* between threads that would otherwise over-utilise a CPU. Its use* should be combined with detailed profiling and benchmarking to* ensure that it actually has the desired effect.** <p> It is rarely appropriate to use this method. It may be useful* for debugging or testing purposes, where it may help to reproduce* bugs due to race conditions. It may also be useful when designing* concurrency control constructs such as the ones in the* {@link java.util.concurrent.locks} package.*/

大致意思:yield()方法会通知线程调度器放弃对处理器的占用,但调度器可以忽视这个通知。yield()方法主要是为了保障线程间调度的连续性,防止某个线程一直长时间占用cpu资源。但是他的使用应该基于详细的分析和测试。这个方法一般不推荐使用,它主要用于debug和测试程序,用来减少bug以及对于并发程序结构的设计。

(二)方法理解:

Thread.yield()翻译成中文就是让步的意思,根据语义理解就是线程让出当前时间片给其他线程执行。这个函数在JSL中未给出明确的语义,就是没有要求具体如何实现,这取决于各个不同jvm的具体实现。部分jvm在执行这个函数时可能什么都不做,但是大部分jvm的实现都是:将线程从running状态转为runnable状态,然后放入同优先级等待队列的末尾,等待前面所有相同优先级的线程调度完成后才可能再度获得执行机会。不过当同优先级队列中刚好只剩这个线程时,那么这个线程可能很快就又获得了cpu时间片。我们常用的HotSpot默认采用的是第二种方式。

我们再看个小例子:

public class YieldTest extends Thread {public YieldTest(String name) {super(name);}@Overridepublic void run() {for (int i = 1; i <= 1000; i++) {System.out.println("" + this.getName() + "-----" + i);if (i == 30 || i == 100 || i == 500 || i == 700 || i == 800 || i == 900) {Thread.yield();}}}public static void main(String[] args) {YieldTest yt1 = new YieldTest("张三");YieldTest yt2 = new YieldTest("李四");yt1.start();yt2.start();}
}

运行结果:

我们会惊奇的发现:调用Thread.yield()后线程并不一定会立刻停止执行,i == 100时调用Thread.yield()后线程没有立刻放弃cpu时间片,李四这个无耻之徒还在执行呢!

这个主要是因为张三从runnable状态切换到running状态是需要一些准备的,这个需要耗费一些时间。系统为了避免cpu资源的浪费还会让李四在执行一小段时间。不过调度器后面一定会让张三执行下的,面子工程必须得做的。所以就如同yield()方法注释中说的,业务代码使用这个函数需慎重。

Thread.yield()相关推荐

  1. Thread.yield()方法表示交出主动权,join表示等待当前线程,可以指定秒数

    Thread.yield()方法表示交出主动权,join表示等待当前线程,可以指定秒数 学习了:http://www.importnew.com/14958.html 膜拜一下 源码膜拜: Threa ...

  2. Thread.yield()和Thread.sleep(0)

    关于Thread.yield()和Thread.sleep(0)的语义问题真是一个让人挠头的问题,翻了好多资料,在java6语言规范中看到了一段这样的描述: 重点在红框中,简而言之就是:sleep(0 ...

  3. java yeild_Java 中 Thread.yield() 方法详解

    对于很多初学 Java 线程的小伙伴们,很容易将 Thread 类里的 yield() 方法理解错误,或者理解得不够透彻,先看下源码: public static native void yield( ...

  4. java thread yield()_Java Thread yield()方法

    Java Thread yield()方法 java.lang.Thread.yield() 方法使当前执行的线程对象来暂停并允许其他线程执行. 1 语法 public static void yie ...

  5. Thread.sleep() 和 Thread.yield() 区别

    Thread.sleep() 和 Thread.yield() 区别 thread Thread.yield() api中解释: 暂停当前正在执行的线程对象,并执行其他线程. 注意:这里的其他也包含当 ...

  6. 线程让步——Thread.yield()

    1.yield()的作用是让步,它能让当前线程由"运行状态"进入到"就绪状态",从而让其它具有相同优先级的等待线程获取执行权.但是,并不能保证在当前线程调用yi ...

  7. Thread.yield()详解

    (1)首先介绍线程运行状态转换,如下图: 新建状态(New):新创建了一个线程对象. 就绪状态(可执行状态,Runnable):线程对象创建后,其他线程调用了该对象的start()方法.该状态的线程位 ...

  8. Thread yield

    线程调用yield()方法后,表明自己做的事已经完成,让出自己的cpu时间给其他线程使用. 让出后,该线程可以重新获得cpu分配的权利,状态变为了可执行状态. sleep与yield的状态转移如下: ...

  9. Thread类中yield方法

    Yield方法可以暂停当前正在执行的线程对象,让其他有相同优先级的线程执行.它是一个静态方法而且只保证当前线程放弃CPU占用而不能保证其它线程一定能占用CPU,执行yield()的线程有可能在进入到暂 ...

最新文章

  1. 关于ANDRID sdk安装过慢问题
  2. s()++php,jquery siblings()函数正确用法
  3. numpy np.sum()函数(求给定轴上的数组元素的总和)(与ndarray.sum()函数等价)
  4. 网页性能优化01-精灵图利弊与应用场景
  5. vue 固定div 滚动_vue移动端 导航吸顶(固定定位)页面滚动出现抖动
  6. python中函数和类的区别_Python中函数和方法的区别
  7. java开发中准则怎么写_Java开发中通用的方法和准则20条
  8. java 数据类型分为_JAVA中分为基本数据类型及引用数据类型
  9. gson解析php,php,android_关于 Gson 解析JSON数据。。。,php,android - phpStudy
  10. python今日内容_python笔记15
  11. mysql 编辑距离 搜索_最小编辑距离(Minimum Edit Distance)
  12. 36-高级特性之自定义类(1)
  13. 文件的记录c语言程序,急求如何将下列C语言程序数据存储到文件中?
  14. Atitit 快速开发的推荐技术标准化 规范 大原则
  15. 字符编码:GBK、GB2312、UTF-8
  16. 从无到有axure原型设计_从零开始学Axure原型设计(入门篇)
  17. 财务管理与计算机论文,计算机小论文--浅论计算机与财务管理.doc
  18. Altium Designer 20查找指定元器件
  19. 手机5g什么时候普及_5G牌照发放仨月,5G手机扎堆上市,何时才能真正普及?
  20. 嗨!亲爱的朋友们,欢迎您光临我的…

热门文章

  1. python 求子字符串_(6)KMP算法(求子串的位置)______字符串的匹配
  2. Java JUC工具类--Master-Worker
  3. 并发不是并行,它更好!
  4. Linux系统重置和修改root密码
  5. H3C 以太网集线器
  6. 函数对象 函数嵌套 名称空间与作用域
  7. [AHOI2009]最小割(最大流+tarjan)
  8. lucene学习的小结
  9. 跨站脚本功攻击,xss,一个简单的例子让你知道什么是xss攻击
  10. 【文章】孝心无价 作者:毕淑敏