多线程学习-基础(五)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)经过测试,优先级高的线程执行频率比优先级低的线程要多。但是偶尔也会有优先级低的线程在优先级高的线程之前执行,只是频率低而已。整体表现为,优先级高的线程优先执行。

原文地址:https://www.cnblogs.com/newwind/p/8902342.html

时间: 2024-10-05 05:04:59

多线程学习-基础(五)sleep()和yield()的区别(理论)的相关文章

多线程学习-基础(十二)生产者消费者模型:wait(),sleep(),notify()实现

一.多线程模型一:生产者消费者模型   (1)模型图:(从网上找的图,清晰明了) (2)生产者消费者模型原理说明: 这个模型核心是围绕着一个"仓库"的概念,生产者消费者都是围绕着:"仓库"来进行操作,一个仓库同时只能被一个生产者线程或一个消费者线程所操作,synchronized锁住的也是这个仓库,仓库是一个容器,所以会有边界值,0和仓库可存放上限,在这个上限内,可以设置多种级别,不同的级别可以执行不同的策略流程. (3)本案例使用知识点: Thread.curre

C#多线程学习之(五)使用定时器进行多线程的自动管理

本文实例讲述了C#多线程学习之使用定时器进行多线程的自动管理.分享给大家供大家参考.具体分析如下: Timer类:设置一个定时器,定时执行用户指定的函数. 定时器启动后,系统将自动建立一个新的线程,执行用户指定的函数. 初始化一个Timer对象: ? 1 Timer timer = new Timer(timerDelegate, s,1000, 1000); 第一个参数:指定了TimerCallback 委托,表示要执行的方法:第二个参数:一个包含回调方法要使用的信息的对象,或者为空引用:第三

多线程学习-基础(三)线程的调度

一.线程调度(1)调整线程的优先级Java线程有优先级,优先级高的线程会获得较多的执行机会,但是只是抢占cpu使用权的机会增加了,并不意味着就一定先执行.Java线程的优先级用整数来表示,取值范围为:1~10 ,Thread有以下3个静态常量:static int MAX_PRIORITY线程可以具有最高优先级 取值:10static int MIN_PRIORITY线程可以具有最低优先级,取值:1static int NORM_PRIORITY分配给线程的默认优先级,取值:5 Thread类的

多线程学习-基础(二)线程状态装换

一.线程状态转换 下面的这个图非常重要!你如果看懂了这个图,那么对于多线程的理解将会更加深刻 状态说明:(1)新建状态(New):新创建了一个线程对象.(2)就绪状态(Runnable):线程被创建后,其他线程调用了该对象的start()方法.该状态的线程位于可运行的线程池中,变得可运行,等待获取cpu的使用权限.(3)运行状态(Running):就绪状态的线程获取了cpu的使用权,执行程序代码.(4)阻塞状态(Blocked):阻塞状态是线程由于某种原因放弃了cpu的使用权,暂时停止运行,直到

C# 多线程学习(五)线程同步和冲突解决

from:https://blog.csdn.net/codedoctor/article/details/74358257 首先先说一个线程不同步的例子吧,以下为售票员的模拟售票,多个售票员出售100张门票,代码如下: using System; using System.Text; using System.Collections.Generic; using System.Threading; namespace threadTest { class Program { class Thr

C++学习基础五之函数参数——形参

一.理论部分 C++中函数形参主要分为两类,如图1所示, 图1 总结: 一.当函数参数为非引用形参时,传进函数体内的是实参的拷贝,(注意,对于基本类型而言,拷贝的是实参的值,对于指针而言拷贝的是实参的地址) (1)若形参为非const的基本类型,则即可接收const实参,也可接收非const实参.只是在函数体内修改形参的值不影响实参的值. 因为对于基本类型的形参而言,传递进函数体的是实参拷贝的值,而不是实参本身,所以在函数体内修改实参的值不影响实参. (2)若形参为非const的指针类型,则即可

多线程学习笔记五-------------多生产者多消费者问题

线程通信--多生产者多消费者问题 多生产者,多消费者会导致线程死锁的情况. public class RoastDuck { public static void main(String[] args) { Duck d = new Duck(); ProductProcess pp = new ProductProcess(d); ProductProcess pp0 = new ProductProcess(d); ConsumeProcess cp = new ConsumeProcess

JavaScript学习 - 基础(五) - 对象

String对象 更详细转:http://www.w3school.com.cn/jsref/jsref_obj_string.asp //-------------------------------------------------------- // string对象属性: // length var x = [1,2,3,4,5,6] document.write(x.length) //6 //---------------------------------------------

C++学习基础二——指针与引用的区别

一.指针: (1)如果对指针进行解引用操作 赋值,改变的是指针所指向对象的值:(2)如果不对指针进行解引用操作 赋值,则改变的是指针本身的值:(3)const指针本身的值不能修改,但是const指针所指向对象的值能不能修改取决于其所指向对象是否为const类型. 例如: 代码片段1: string s1("some value"); string *sp1 = &s1;//此时s1的值为“some value”,指针sp1指向s1 string s2("another