1

我对 Yield 的定义有点怀疑:

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

public static void [yield][1]()

向调度程序提示当前线程愿意放弃其当前对处理器的使用。调度程序可以随意忽略此提示。

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

在这个链接上,写着在yield上,线程肯定会被挂起。

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

有人可以解释一下吗?

4

3 回答 3

4

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

正确的!

如果 javadoc 这么说,那么它是正确的。javadoc 是权威。就是说允许实现忽略yield. 即使您发现的每个 Java 实现都没有这样做,javadoc 也说允许新的实现来做。

事实上,yield如果系统中没有其他东西可以被调度,线程调度器忽略它是非常合理的。

在这个链接上,写着在yield上,线程肯定会被挂起。

该链接页面不正确。干净利落。


如果您希望线程绝对暂停,请sleep(...)使用大于零的参数调用。javadoc 说:

“导致当前执行的线程休眠(暂时停止执行)指定的毫秒数,取决于系统计时器和调度程序的精度和准确性。”

后者意味着您无法准确预测线程将休眠多长时间......但它会休眠。(实际上,线程的睡眠时间不太可能少于指定的参数......)

于 2013-09-06T04:56:52.690 回答
0

Thread.yield 是调用系统函数(如果有)的本机方法,例如 Windows SwitchToThread 函数http://msdn.microsoft.com/en-us/library/windows/desktop/ms686352(v=vs.85).aspx,在那里你可以知道确切的行为。

于 2013-09-06T04:48:54.180 回答
0

在抢占式调度操作系统(像所有现代操作系统一样)中,让步是对操作系统的让步请求。您不能强制操作系统在 java 或任何其他用户空间代码中运行另一个线程,您总是受调度程序的支配。可以免费立即重新安排您的时间,而不会跳过一个节拍。这实际上是使无锁算法如此有趣的部分原因:即使调度程序是病态的,它们也会继续工作。

话虽这么说,操作系统知道,如果您使用 yield(),您确实是有意的,因此它们实际上倾向于切换线程。

于 2013-09-06T04:54:57.233 回答