Thread.yield() 如果我们有足够的处理器来为所有线程提供服务,那么 Thread.yield() 会做任何事情吗?

如果我们在具有两个处理器的计算机上有两个正在运行的线程,并且我们在其中一个线程中调用,那么是否有理由什么都不会发生(调度程序基本上会忽略该请求),因为我们有足够的处理器来为正在运行的线程提供服务?Thread.yield()


答案 1

每当线程调用该方法时,它都会向线程调度程序发出提示,表明它已准备好暂停其执行。线程调度程序可以自由地忽略此提示。Thread.yield()

如果任何线程执行 yield 方法,则线程调度程序将检查是否存在任何可运行(等待执行)线程,其优先级与此线程相同或较高。如果处理器找到任何具有更高或相同优先级的线程,则它将切换到新线程。否则,当前线程将继续执行。

因为,在你的例子中,你有足够的处理器来服务所有的线程(它们正在运行,而不是在可运行状态下等待); 将不执行任何操作,并且您的线程将继续执行。Thread.yield()

关于Windows的说明,来自Microsoft DOTNet:

此方法等效于使用平台调用来调用本机 Win32 SwitchToThread 函数。

输出仅限于执行调用线程的处理器。操作系统不会将执行切换到另一个处理器,即使该处理器处于空闲状态或正在运行优先级较低的线程也是如此。如果没有其他线程准备在当前处理器上执行,则操作系统不会产生执行

因此,在某些情况下可能会有一些警告。


答案 2

Thread.yield()已过时。除非您的程序将在实现协作式多任务处理的平台上运行,或者在仍然使用绿色线程的JVM上运行,否则调用它是没有意义的。

用于Thread.yield()的标准库Javadoc有效地表示,根本不需要做任何事情。yield()


推荐