我对Yield的定义有点怀疑:
在java文档中。产量描述为:
public static void [yield][1]()
提示当前线程愿意产生的调度程序 它目前的用途 处理器。调度程序可以忽略此提示。
这意味着当前线程暂时不会暂停。它只是向调度程序指示。现在由调度程序来决定是否要停止线程的执行。是吗?
在这个链接中,有人写道,在收益率上,线程肯定会被暂停。
http://www.tutorialspoint.com/java/lang/thread_yield.htm
有人可以解释一下吗?
答案 0 :(得分:4)
这意味着当前线程暂时不会暂停。它只是向调度程序指示。现在由调度程序决定是否要停止执行线程。正确?
右键!
如果javadoc说的话,那就是正确的。 javadoc是权威。这是说允许实现忽略yield
。即使您找到的每个Java实现都没有这样做,javadoc也会说允许新的实现执行它。
事实上,如果系统中没有任何其他内容可供调度,则线程调度程序忽略yield
是非常合理的。
在这个链接中,有人写道,在收益率上,线程肯定会被暂停。
该链接页面不正确。简单明了。
如果您希望线程明确暂停,请使用大于零的参数调用sleep(...)
。 javadoc说:
“使当前正在执行的线程休眠(暂时停止执行)达到指定的毫秒数,具体取决于系统定时器和调度程序的精度和准确性。”
后者意味着你无法准确预测线程将睡多久但它会睡觉。 (实际上,线程不太可能比指定的参数睡眠时间更短......)
答案 1 :(得分:0)
Thread.yield是一个本机方法,它调用系统函数(如果有的话),例如Windows SwitchToThread函数http://msdn.microsoft.com/en-us/library/windows/desktop/ms686352(v=vs.85).aspx,在那里你可以知道确切的行为。
答案 2 :(得分:0)
在抢先式调度操作系统(与所有现代操作系统一样)中,屈服是对操作系统的请求。您无法强制操作系统在java或任何其他用户空间代码中运行另一个线程,您始终受调度程序的支配。它可以立即重新安排你,而不会跳过一个节拍。这实际上是使无锁算法变得如此有趣的一部分:即使调度程序是病态的,它们也会继续工作。
话虽如此,操作系统明白,如果你屈服于(),你真的想要它,所以他们倾向于实际切换线程。