如果我们在一台有两个处理器的机器上有两个运行中的线程,并且在其中一个线程中调用了Thread.yield()
,那么是否合理认为什么都不会发生(调度程序将基本忽略请求),因为我们有足够的处理器来为运行中的线程提供服务?
如果我们在一台有两个处理器的机器上有两个运行中的线程,并且在其中一个线程中调用了Thread.yield()
,那么是否合理认为什么都不会发生(调度程序将基本忽略请求),因为我们有足够的处理器来为运行中的线程提供服务?
Thread.yield()
方法时,它向线程调度程序提示它准备暂停执行。线程调度程序可以忽略此提示。Thread.yield()
将无效,您的线程将继续执行。Thread.yield()
有任何作用,它会告诉调度器:调用者(a)仍有任务需要完成,(b)不想放弃正在运行的处理器,但是(c)如果其他线程需要处理器时,愿意放弃处理器。唯一重要的处理器是调用者正在运行的处理器。唯一重要的数字是希望运行在处理器上的其他线程的数量(具体来说,这个数字是零还是大于零)。 - Solomon SlowThread.yield()
已经过时。除非你的程序将在实现了 协作式多任务处理 的平台上运行,或在仍使用 绿色线程 的 JVM 上运行,否则调用它是没有意义的。
Thread.yield() 的标准库文档有效地说明了 yield()
可以不做任何事情。
我一直认为Thread::yield
应该被Thread::onSpinWait
(自Java 9起)替换 - 这只是一种“较弱”的让渡,直到我看到在StampedLock
中使用它们 同时:
else if ((LockSupport.nextSecondarySeed() & OVERFLOW_YIELD_RATE) == 0)
Thread.yield();
else
Thread.onSpinWait();
return 0L;
所以我认为它并非过时。在 jdk 源代码内部,它有很多用途,甚至相对较新的 ForkJoinPool
都使用了 Thread::yield
。
实际上,我仅在繁忙自旋中使用 Thread::onSpinWait
- 因为从其名称至少可以清楚地知道何时使用它;而关于 yield,则不太清楚何时如何使用,所以我无法确定。
仅代表我的个人看法。
Thread.yield()
是一种轻微的代码异味。它不像调用sleep()
那样糟糕,但当我看到它时我肯定会感到怀疑。通常情况下,这是由正在轮询变化的线程使用的,而他们应该等待监视器、监听事件、注册异步回调等。 - John KugelmanThread::onSpinWait
在Java-9中被添加了。不过我仍然无法确定何时使用哪个。 - Eugene