执行顺序的疑问,不知道下面的理解是否正确?
如果:线程 A 和当前线程优先级相同 yield()可以保证先执行线程 A 而 sleep(0)无法保证谁先执行
希望知道的同学可以解释一下,谢谢啦
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 的.
|
2
vegito2002 2017-12-13 14:07:11 +08:00
另外任何一个都无法保证谁先执行. 优先级并不是决定 scheduler 决策的唯一标准, 建议搜一下 MLFQS
|
3
lollipogo OP @vegito2002 嗯...底层知识很少,主要是看 Java 线程相关知识点的时候,想到了这一点,但感觉网上的资料说的都不是很清楚,大神能不能说一下如果是 Java 的话,这两种写法的区别...
|
4
vegito2002 2017-12-13 14:20:12 +08:00
@lollipogo 这个就不知道了, 我只知道操作系统的层面的只是, 具体到一个 library 怎么实现的, 等楼下吧
|
5
lollipogo OP @vegito2002 谢谢啦,就是考虑 sleep(0)可能就是让所有线程的执行顺序重新排一下,在想 yield()会不会有特殊的机制去保证大家都一样的情况下优先执行别的线程
|
6
kanshan 2017-12-13 15:44:52 +08:00
从字面理解这两个是不同的功能
yield 是把当前线程的运行机会交给其它线程 ,是一个本地方法 而 sleep 是休眠当前线程 在休眠的这段时间类 cpu 会执行其它的线程 执行线程的优先级越高越容易被执行到 如果你想知道更细的信息 就只有去看看 jni 对应的源码了 |