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

关于Thread.yield()和Thread.sleep(0)的语义问题真是一个让人挠头的问题,翻了好多资料,在java6语言规范中看到了一段这样的描述:
在这里插入图片描述
重点在红框中,简而言之就是:sleep(0)和yield()的实现不需要任何可见的效果。那么在实现这两个函数的语义时就可以什么都不做,这取决于具体的JVM实现。后来再看java8的语言规范时发现红框内的提示被去掉了,官方给出了下面的解释:
在这里插入图片描述
大致意思就是说之前的那句没表达清楚,所以在语言规范中去掉了,最后强调的说了:java语言规范不希望yiled和spleep(0)具有很强的明确语义,可以不用实现他们。
后来又在**《java concurrency in practice》**的注释中找到了这么一句(《java concurrency in practice》这本书是设计juc的几个人写的,可靠性是非常高的)

The semantics of Thread.yield and Thread.sleep(0) are undefined [JLS17.9]; the JVM is free to implement them as no-ops or treat them as scheduling hints. In particular, they are not required to have the semantics of sleep(0) on Unix systems — put the current thread at the end of the run queue for that priority, yielding to other threads of the same priority — though some JVMs implement yield in this way.
<-------------------------分割线哥哥------------------------------------------------------------------------>
翻译:
java规范中并没有定义Thread.yield和Thread.sleep(0)的语义。jvm可以自由的去实现他们,可以不做任何操作,也可以给系统调度器提示。特别说下,sleep(0)在Unix系统下的语义是:把线程放到运行队列的末尾,并且让出执行权给其他同优先级的线程,很多的jvm也是这末实现的,但并不是要求必须这末实现,你想怎么玩就怎么玩,没人管你。

最后再来看下我们常用的hotspot中的具体实现:在这里插入图片描述上面这段代码是hotspot的源码,由于ConvertSleepToYield的默认值为true,所以在hotspot中当sleep(0)时效果相当于yield()。会让当前线程放弃剩余时间片,进入相同优先级线程队列的队尾,只有排在前面的所有同优先级线程完成调度后,它才能再次获执行的机会。

总结

结合java doc中这两个函数的注解总结下:
Thread.yield()和Thread.sleep(0)语义实现取决于具体的jvm虚拟机,某些jvm可能什么都不做,而大多数虚拟机会让线程放弃剩余的cpu时间片,重新变为runnable状态,并放到同优先级线程队列的末尾等待cpu资源。 但是当我们调用Thread.yield()的那一刻,并不意味着当前线程立马释放cpu资源,这是因为获得时间片的线程从runable切换到running仍需要一定的准备时间,这段时间当前线程仍可能运行一小段时间。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/450966.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OOA:面向对象

见&#xff1a;https://baike.baidu.com/item/OOA/3659916?fraladdin OOA:面向对象&#xff1a; Object-Oriented Analysis&#xff08;面向对象分析方法&#xff09;是确定需求或者业务的角度&#xff0c;按照面向对象的思想来分析业务。例如&#xff1a;OOA只是对需求中描述…

DCT原型 ——傅里叶级数

傅里叶级数 法国数学家傅里叶发现&#xff0c;任何周期函数都可以用正弦函数和余弦函数构成的无穷级数来表示&#xff08;选择正弦函数与余弦函数作为基函数是因为它们是正交的&#xff09;&#xff0c;后世称为傅里叶级数&#xff08;法语&#xff1a;srie de Fourier&#xf…

c 递归算法

#include <stdio.h>double factorial(unsigned int i) {if(i < 1){return 1;}return i * factorial(i - 1); } int main() {int i 15;printf("%d 的阶乘为 %f\n", i, factorial(i));return 0; } 转载于:https://www.cnblogs.com/sea-stream/p/9822437.htm…

红黑树和B+树

&#xff08;一&#xff09;红黑树 红黑树是一种自平衡二叉查找树&#xff0c;也被称为"对称二叉B树"&#xff0c;它可以在O(logn)时间内利用 O(logn)的空间来完成查找、插入、删除操作。红黑树的读操作与普通二叉查找树相同&#xff0c;而插入和删除操作可能会破坏…

策略模式、观察者模式、代理模式、装饰模式 应用场景和实现

有个大神写的很好&#xff1a; 参考&#xff1a;设计模式学习笔记&#xff08;四&#xff1a;策略模式&#xff09; 参考&#xff1a;设计模式学习笔记&#xff08;二&#xff1a;观察者模式&#xff09; 参考&#xff1a;设计模式学习笔记-代理模式 参考&#xff1a;设计模式-…

DQL、DML、DDL、DCL的概念与区别

http://blog.csdn.net/tomatofly/article/details/5949070 SQL语言的分类 SQL语言共分为四大类&#xff1a;数据查询语言DQL&#xff08;Data Query Language&#xff09;&#xff0c;数据操纵语言DML&#xff0c;数据定义语言DDL(Data Definition Language)&#xff0c;数据…

python学习总结

1.python环境搭建方便&#xff0c;只需要安装python解释器 2.python把任意数据类型赋值给变量&#xff0c;不用定义类型 3.Python的整数浮点数没有大小限制&#xff0c;不用担心超过数值范围。比如java的 int&#xff0c;long 4.python自带最常用的list列表和dicitonary字典&am…

李国杰院士:国内开源社区的崛起需要一个过程

[CSDN.NET 付江/文]日前&#xff0c;在第二届“龙芯杯”中国开源软件设计大赛启动仪式上&#xff0c;CSDN记者专访了中国工程院院士、第三世界科学院院士李国杰。李国杰院士就国产基础软件现状、面临的机遇和挑战、开源环境以及生态系统建设等话题分享了自己的看法。 打造自主…

SuperMap iObject入门开发系列之五管线属性查询

本文是一位好友“托马斯”授权给我来发表的&#xff0c;介绍都是他的研究成果&#xff0c;在此&#xff0c;非常感谢。 管线属性查询功能针对单一管线图层进行特定的条件查询&#xff0c;然后将查询结果输出为列表&#xff0c;并添加点位闪烁功能&#xff0c;例如查询污水管线中…

三类基于贪心思想的区间覆盖问题

一、区间完全覆盖问题 问题描述&#xff1a;给定一个长度为m的区间&#xff0c;再给出n条线段的起点和终点&#xff08;注意这里是闭区间&#xff09;&#xff0c;求最少使用多少条线段可以将整个区间完全覆盖。 样例&#xff1a;一个长度为8的区间&#xff0c;可选的线段有[2,…

ubuntu 常用软件和命令

永久修改屏幕的分辨率   sudo gedit .profile 将下面的四句话加入。.profile文件的最后   cvt 1280 768   xrandr --newmode "1280x768_60.00" 79.50 1280 1344 1472 1664 768 771 781 798 -hsync vsync   xrandr --addmode Virtual1 "1280x768_60.00&q…

Eclipse搭建Android开发环境(安装ADT,Android4.4.2)

见&#xff1a;http://blog.csdn.net/zht666/article/details/29837777 使用Eclipse做Android开发&#xff0c;需要先在Eclipse上安装ADT&#xff08;Android Development Tools&#xff09;插件。 1.安装JDK 1.7 JDK官网http://www.oracle.com/technetwork/java/javase/downlo…

C语言 位操作简析

位运算 前面介绍的各种运算都是以字节作为最基本位进行的。 但在很多系统程序中常要求在位(bit)一级进行运算或处理。&#xff23;语言提供了位运算的功能&#xff0c; 这使得&#xff23;语言也能像汇编语言一样用来编写系统程序。 一、位运算符&#xff23;语言提供了六种位运…

算法:输入一个链表,输出该链表中倒数第k个结点。

算法&#xff1a;输入一个链表&#xff0c;输出该链表中倒数第k个结点。《剑指offer》 思路加到注释里面了&#xff1b; 1&#xff1a;两个if判断是否返回值为空&#xff0c;首个为空&#xff0c;没有第k个值&#xff1b; 2&#xff1a;for循环找到倒数第k个值&#xff0c;返回…

Spring事务那些事儿

&#xff08;一&#xff09;事务的隔离级别 大家都知道事务有四个属性&#xff0c;即ACID&#xff08;原子性、一致性、隔离性、持久性&#xff09;。这四个里面稍微难理解点的是一致性和持久性。所谓的一致性是指&#xff1a;事务执行前后数据的一致性状态&#xff0c;例如事…

Silverlight Blend动画设计系列八:拖放(Drag-Drop)操作与拖放行为(DragBehavior)

Silverlight & Blend动画设计系列八&#xff1a;拖放(Drag-Drop)操作与拖放行为(DragBehavior) 原文:Silverlight & Blend动画设计系列八&#xff1a;拖放(Drag-Drop)操作与拖放行为(DragBehavior)在Silverlight中自身并没有提供拖放功能的相关实现&#xff0c;要实现拖…

mysql查询显示行号

见&#xff1a;http://blog.csdn.net/muzizhuben/article/details/49449853 使用mysql查询显示行号&#xff0c;没有像oracle这么方便。 不过也可以通过设定变量显示行号&#xff0c;例如&#xff1a; -- 生成 行号 select r:r1 as rowno , a.* from my_tb a ,(select r:0) b …

scanf 用法大全

关于标准库函数scanf论坛上很多人对scanf的不太了解&#xff0c;导致程序出错&#xff0c;我想把scanf的具体用法贴出来&#xff0c;希望大家可以共同进步&#xff0c;有什么不对的地方可以提出来。int scanf(char *format&#xff0c;...);这应该是scanf的标准形式。先说说关于…

深入了解Spring IoC

IoC全称Inversion of Control即控制反转&#xff0c;它还有一个别名依赖注入。spring利用Ioc容器帮我们自动构建对象及注入依赖对象&#xff0c;减少了对象构建与业务代码的耦合&#xff0c;使得我们能够更加高效愉快的写bug&#x1f41e;了(&#xffe3;▽&#xffe3;)"…

软文营销实战记录

最近拜读了徐茂权老师的《 网络营销决胜武器(第2版)》&#xff0c;下面会梳理书中的内容&#xff0c;记录下以后可能会用到的软文营销的技巧。 一、软文载体 1、平面媒体软文&#xff1a;报纸、期刊。 2、非正式出版的基于印刷、打印形式载体的软文&#xff1a;企业印刷的宣传册…