为thread.yield编写的描述是否正确?

时间:2013-09-06 04:15:49

标签: java multithreading

我对Yield的定义有点怀疑:

在java文档中。产量描述为:

public static void [yield][1]()
  

提示当前线程愿意产生的调度程序   它目前的用途       处理器。调度程序可以忽略此提示。

这意味着当前线程暂时不会暂停。它只是向调度程序指示。现在由调度程序来决定是否要停止线程的执行。是吗?

在这个链接中,有人写道,在收益率上,线程肯定会被暂停。

http://www.tutorialspoint.com/java/lang/thread_yield.htm

有人可以解释一下吗?

3 个答案:

答案 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或任何其他用户空间代码中运行另一个线程,您始终受调度程序的支配。它可以立即重新安排你,而不会跳过一个节拍。这实际上是使无锁算法变得如此有趣的一部分:即使调度程序是病态的,它们也会继续工作。

话虽如此,操作系统明白,如果你屈服于(),你真的想要它,所以他们倾向于实际切换线程。