一、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()的区别(理论)的更多相关文章

  1. 多线程学习-基础(一)Thread和Runnable实现多线程

    很久没记录一些技术学习过程了,这周周五的时候偶尔打开“博客园”,忽然让我产生一种重拾记录学习过程的想法,记录下学习研究过程的一点一滴,我相信,慢慢地就进步了!最近想学习一下多线程高并发,但是多线程在实 ...

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

    一.多线程模型一:生产者消费者模型   (1)模型图:(从网上找的图,清晰明了) (2)生产者消费者模型原理说明: 这个模型核心是围绕着一个“仓库”的概念,生产者消费者都是围绕着:“仓库”来进行操作, ...

  3. 多线程学习-基础(四)常用函数说明:sleep-join-yield

    一.常用函数的使用 (1)Thread.sleep(long millis):在指定的毫秒内让当前正在执行的线程休眠(暂停执行),休眠时不会释放当前所持有的对象的锁.(2)join():主线程等待子线 ...

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

    本文实例讲述了C#多线程学习之使用定时器进行多线程的自动管理.分享给大家供大家参考.具体分析如下: Timer类:设置一个定时器,定时执行用户指定的函数. 定时器启动后,系统将自动建立一个新的线程,执 ...

  5. Java多线程学习(五)线程间通信知识点补充

    系列文章传送门: Java多线程学习(二)synchronized关键字(1) Java多线程学习(二)synchronized关键字(2) Java多线程学习(三)volatile关键字 Java多 ...

  6. 多线程学习-基础( 十一)synchronized关键字修饰方法的简单案例

    一.本案例设计到的知识点 (1)Object的notify(),notifyAll(),wait()等方法 (2)Thread的sleep(),interrupt(). (3)如何终止线程. (4)如 ...

  7. 多线程学习-基础( 十)一个synchronized(){/*代码块*/}简单案例分析

    一.提出疑惑 上一篇文章中,分析了synchronized关键字的用法.但是好像遗漏了一种情况. 那就是: synchronized(obj){/*同步块代码*/} 一般有以下几种情况: (1)syn ...

  8. 多线程学习-基础(六)分析wait()-notify()-notifyAll()

    一.理解wait()-notify()-notifyAll()obj.wait()与obj.notify()必须要与synchronized(Obj)一起使用,也就是wait,notify是针对已经获 ...

  9. 关于多线程中sleep、join、yield的区别

    好了.说了多线程,那就不得不说说多线程的sleep().join()和yield()三个方法的区别啦 1.sleep()方法 /** * Causes the currently executing ...

随机推荐

  1. BZOJ4930: 棋盘

    BZOJ4930: 棋盘 https://lydsy.com/JudgeOnline/problem.php?id=4930 分析: 基本上就是游戏那道题加上费用流了,所以没啥好说的. 记得两边都是拆 ...

  2. ACM学习历程—HDU5666 Segment(数论)

    http://acm.hdu.edu.cn/showproblem.php?pid=5666 这题的关键是q为质数,不妨设线段上点(x0, y0),则x0+y0=q. 那么直线方程则为y = y0/x ...

  3. ADMEMS软件架构的4个阶段

    业界软件架构设计的方法论很多,各有各自的应用场景和特点,下文结合ADMEMS(Architecture Design Method has been Extended to Method System ...

  4. 详解Top命令 输出命令行选项及代码

    Linux中的top命令显示系统上正在运行的进程.它是系统管理员最重要的工具之一.被广泛用于监视服务器的负载.在本篇中,我们会探索top命令的细节.top命令是一个交互命令.在运行top的时候还可以运 ...

  5. linux 内核移植和根文件系统的制作【转载】

    原文地址:http://www.cnblogs.com/hnrainll/archive/2011/06/09/2076214.html 1.1 Linux内核基础知识 在动手进行Linux内核移植之 ...

  6. Mesos-slave启动处理记录

    1. work_dir错误导致启动异常 /etc/mesos-slave/work_dir设置的目录不存在或者权限不够将会导致启动异常. 2. 根据日志信息以及status信息来判断问题 通过serv ...

  7. flask之基础概念

    [应用]一个 Flask 应用是一个 Flask 类的实例.可以在一个被称为应用工厂的函数内部创建 Flask实例.所有应用相关的配置.注册和其他设置都会在函数内部完成,然后返回这个应用.__init ...

  8. jQuery.extend()方法

    定义和用法 jQuery.extend()函数用于将一个或多个对象的内容合并到目标对象. 注意: 1. 如果只为$.extend()指定了一个参数,则意味着参数target被省略.此时,target就 ...

  9. Order By操作

    本文转载自:http://www.cnblogs.com/vingi/articles/2450482.html 适用场景:对查询出的语句进行排序,比如按时间排序等等. 说明:按指定表达式对集合排序: ...

  10. FlatBuffers使用简介

    @[tools|flatbuffers|opensource] 概述### Google在今年6月份发布了跨平台序列化工具FlatBuffers,提供了C++/Java/Go/C#接口支持,这是一个注 ...