Thread.yield() 仍然是一个跨平台雷区吗?

3
我可以找到旧的参考资料和SO答案,这些资料说Thread.yield()的行为因平台而异。这个答案表明这是因为实际上没有规定该行为。
在现代Java版本中,Thread.yield()的行为仍然因平台而异吗? 编辑 我已经阅读了文档。我理解它的含义。我问的是实际行为。

是的。请参阅文档:“提示调度程序当前线程愿意放弃其当前使用的处理器。调度程序可以选择忽略此提示。” - Boris the Spider
我在询问实际行为。是哪个JVM? - Sotirios Delimanolis
如果除了在Windows上的CarrotJVM之外,行为在所有平台上都是一致的,那么这就很相关。@SotiriosDelimanolis - G. Ann - SonarSource Team
2个回答

5

从Java 8 API(截至目前最新的非测试版本):

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

Yield是一种启发式尝试,旨在改善本来会过度利用CPU的线程之间的相对进展。应结合详细的分析和基准测试使用,以确保其实际具有所需的效果。

很少适合使用此方法。它可能在调试或测试目的中有用,因为它可以帮助重现由于竞争条件而导致的错误。在设计类似于java.util.concurrent.locks包中的并发控制构造时,它也可能很有用。

这些含义是:

  • 是,仍然依赖于平台
  • 是,启发式的

2
即使在不同平台上,Thread.yield() 的具体细节有所不同,但该方法调用基本上什么也不做。您调用它,它什么也不做,并且在尽可能快的时间内返回,除非它可能会或可能不会结束线程的当前时间片。

它是一个“跨平台的雷区”吗?

如果您编写的代码需要 Thread.yield() 真正结束调用者的时间片才能正常工作,则您已编写了特定于平台的代码。但是,如果您需要特定于平台的行为,Java 可能不应该是您的首选语言。


2
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Gabe Sechan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接