多线程学习-基础(五)sleep()和yield()的区别(理论)
一、sleep()和yield()的区别
(1)sleep()使当前线程进入停滞状态(即阻塞状态),所以执行sleep()的线程在指定的时间内不会被执行;
(2)yield()只是使当前线程从运行状态转到可运行状态(即就绪状态),所以执行yield()的线程有可能进入到可执行状态之后立马又被执行。
(3)sleep()方法使当前运行的线程休眠一段时间,进入不可运行的阻塞状态,这段时间的长短由程序设定。yield()方法使当前线程回退到可运行状态(即就绪状态),
但是让出的时间是不可定的。实际上yield()方法对应了如下操作:先检测当前是否有相同优先级的线程处于可运行状态,如有,则把CPU的占有权交给此类(包括自己)线程来竞争,否则运行
当前这个调用yield()的线程。
(4)所以yield()方法被称为”退让“,他把运行机会让给了其他同优先级的线程,如果此时只存在当前线程和一个低于当前线程执行优先级的线程,那么仍然会优先执行当前线程。
值得注意的是,这里的优先级只是表示执行的机会的多寡,并不表示优先级高的线程一定就比优先级低的线程先拿到CPU的权限去执行。只是执行概率问题。
(5)sleep()允许较低优先级的线程获得运行机会,但yield()方法执行时,当前线程仍然处于可运行状态,所以不可能让出让较低优先级线程获得CPU运行权的机会,
(此处说的只是一个运行机会的让出,随后到底是哪个线程执行,仍然需要竞争,只是竞争成功的概率多寡而已)。
(6)在一个系统中,如果较高优先级的线程没有调用sleep(),又没有受到I/O阻塞,一般来说那么较低优先级的线程只能等到较高优先级的线程执行结束之后才有机会执行。
(7)经过测试,优先级高的线程执行频率比优先级低的线程要多。但是偶尔也会有优先级低的线程在优先级高的线程之前执行,只是频率低而已。整体表现为,优先级高的线程优先执行。
多线程学习-基础(五)sleep()和yield()的区别(理论)的更多相关文章
- 多线程学习-基础(一)Thread和Runnable实现多线程
很久没记录一些技术学习过程了,这周周五的时候偶尔打开“博客园”,忽然让我产生一种重拾记录学习过程的想法,记录下学习研究过程的一点一滴,我相信,慢慢地就进步了!最近想学习一下多线程高并发,但是多线程在实 ...
- 多线程学习-基础(十二)生产者消费者模型:wait(),sleep(),notify()实现
一.多线程模型一:生产者消费者模型 (1)模型图:(从网上找的图,清晰明了) (2)生产者消费者模型原理说明: 这个模型核心是围绕着一个“仓库”的概念,生产者消费者都是围绕着:“仓库”来进行操作, ...
- 多线程学习-基础(四)常用函数说明:sleep-join-yield
一.常用函数的使用 (1)Thread.sleep(long millis):在指定的毫秒内让当前正在执行的线程休眠(暂停执行),休眠时不会释放当前所持有的对象的锁.(2)join():主线程等待子线 ...
- C#多线程学习之(五)使用定时器进行多线程的自动管理
本文实例讲述了C#多线程学习之使用定时器进行多线程的自动管理.分享给大家供大家参考.具体分析如下: Timer类:设置一个定时器,定时执行用户指定的函数. 定时器启动后,系统将自动建立一个新的线程,执 ...
- Java多线程学习(五)线程间通信知识点补充
系列文章传送门: Java多线程学习(二)synchronized关键字(1) Java多线程学习(二)synchronized关键字(2) Java多线程学习(三)volatile关键字 Java多 ...
- 多线程学习-基础( 十一)synchronized关键字修饰方法的简单案例
一.本案例设计到的知识点 (1)Object的notify(),notifyAll(),wait()等方法 (2)Thread的sleep(),interrupt(). (3)如何终止线程. (4)如 ...
- 多线程学习-基础( 十)一个synchronized(){/*代码块*/}简单案例分析
一.提出疑惑 上一篇文章中,分析了synchronized关键字的用法.但是好像遗漏了一种情况. 那就是: synchronized(obj){/*同步块代码*/} 一般有以下几种情况: (1)syn ...
- 多线程学习-基础(六)分析wait()-notify()-notifyAll()
一.理解wait()-notify()-notifyAll()obj.wait()与obj.notify()必须要与synchronized(Obj)一起使用,也就是wait,notify是针对已经获 ...
- 关于多线程中sleep、join、yield的区别
好了.说了多线程,那就不得不说说多线程的sleep().join()和yield()三个方法的区别啦 1.sleep()方法 /** * Causes the currently executing ...
随机推荐
- itext生成pdf(附带页眉,页脚,页码)
package cn.picclife.mwx.salesupport.marketactivity.util; import java.io.File; import java.io.FileOut ...
- Bender Problem
Robot Bender decided to make Fray a birthday present. He drove n nails and numbered them from 1 to n ...
- 取余运算(mod)(分治)
[问题描述] 输入b,p,k的值,求bp mod k的值.其中b,p,k*k为长整形数. [输入样例]mod.in 2 10 9 [输出样例]mod.out ...
- 【redis】redis的 key的命名规则
key的命名规则 定义为 MS-TEN:SESSION_KEY_IN_LOGIN_NAME:fqh 使用:进行分割,这样存入redis的是有层次结构的,如下
- 开放群组架构TOGAF
作于一个架构师尤其是企业架构师来说,丰富的理论知识可以帮助他在架构规划及管理过程中站在更高的角度去看待问题,历史发展原因有很多已成体系的架构理论,TOGAF是近年来比较接地气的,受到了政府和银行业的重 ...
- PIX v2版本中Query 失败时, ERR段的构造
在ITI-9中描述PIX query事务的几个TestCase场景.其中有些是对于Query失败的描述. ERR 段包含Error location, Error code, Error code t ...
- 用Json Template在Azure上创建Cisco CSR路由器
Azure的ARM模式可以通过Json的模板创建VM.本文以Cisco的CSR的image为例,介绍如何用Json的创建VM. 一.Cisco CSR的Image 首先把Cisco CSR的image ...
- [转载]create_proc_read_entry中函数的说明
原型: struct proc_dir_entry *create_proc_read_entry (const char *name, mode_t mode, struct proc_dir_en ...
- 转:Oracle下创建ASM磁盘总结
Oracle下创建ASM磁盘总结 文章转载:https://blog.csdn.net/okhymok/article/details/78791841?utm_source=blogxgwz1 2. ...
- 编译适用于TP-Link WR703N的OpenWRT固件
编译适用于TP-Link WR703N TP-Link MR11U 以及使用AR9331芯片组的单WAN/LAN复用口的路由. 注:刷机有风险,刷机需谨慎.一般情况下是不会失败的,若无法通过捅Rese ...