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

  • 相关阅读:
    jdbc详解(三)
    超文本传输协议-HTTP/1.1
    前人栽树,后人擦屁股
    JAVA 读取计算机中相关信息
    POJ 1836-Alignment(DP/LIS变形)
    【Android】自己定义控件实现可滑动的开关(switch)
    加深理解UIView,UIResponder,UIController
    Fuel4d 2.3 公布
    Android中使用IntentService运行后台任务
    POJ2762 Going from u to v or from v to u? 强连通+缩点
  • 原文地址:https://www.cnblogs.com/newwind/p/8902342.html
Copyright © 2011-2022 走看看