V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
lollipogo
V2EX  ›  问与答

关于线程的 yield()和 sleep(0)的一点问题

  •  
  •   lollipogo · 2017-12-13 13:55:42 +08:00 via Android · 2246 次点击
    这是一个创建于 2528 天前的主题,其中的信息可能已经有所发展或是发生改变。

    执行顺序的疑问,不知道下面的理解是否正确?

    如果:线程 A 和当前线程优先级相同 yield()可以保证先执行线程 A 而 sleep(0)无法保证谁先执行

    希望知道的同学可以解释一下,谢谢啦

    6 条回复    2017-12-13 15:44:52 +08:00
    vegito2002
        1
    vegito2002  
       2017-12-13 14:05:24 +08:00   ❤️ 2
    看你的系统的 yield 和 sleep 是怎么实现的. 一般来说 yield 就是设置成 READY, 然后重新参与 schedule, sleep 一般是改成 BLOCk 状态, 所以无法立即参与 schedule. 但是你给 sleep 参数 0, 这个就很 open-ended 了, 有些系统的 sleep 是自动对 0 进行 no-op 的.
    vegito2002
        2
    vegito2002  
       2017-12-13 14:07:11 +08:00
    另外任何一个都无法保证谁先执行. 优先级并不是决定 scheduler 决策的唯一标准, 建议搜一下 MLFQS
    lollipogo
        3
    lollipogo  
    OP
       2017-12-13 14:16:57 +08:00 via Android
    @vegito2002 嗯...底层知识很少,主要是看 Java 线程相关知识点的时候,想到了这一点,但感觉网上的资料说的都不是很清楚,大神能不能说一下如果是 Java 的话,这两种写法的区别...
    vegito2002
        4
    vegito2002  
       2017-12-13 14:20:12 +08:00
    @lollipogo 这个就不知道了, 我只知道操作系统的层面的只是, 具体到一个 library 怎么实现的, 等楼下吧
    lollipogo
        5
    lollipogo  
    OP
       2017-12-13 14:23:00 +08:00 via Android
    @vegito2002 谢谢啦,就是考虑 sleep(0)可能就是让所有线程的执行顺序重新排一下,在想 yield()会不会有特殊的机制去保证大家都一样的情况下优先执行别的线程
    kanshan
        6
    kanshan  
       2017-12-13 15:44:52 +08:00
    从字面理解这两个是不同的功能

    yield 是把当前线程的运行机会交给其它线程 ,是一个本地方法
    而 sleep 是休眠当前线程 在休眠的这段时间类 cpu 会执行其它的线程 执行线程的优先级越高越容易被执行到


    如果你想知道更细的信息 就只有去看看 jni 对应的源码了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1505 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 17:21 · PVG 01:21 · LAX 09:21 · JFK 12:21
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.