当前答案已过期,鉴于最近的更改,需要修订。
从6到9,Java版本之间没有实际差异Thread.yield()
。
TL; DR;
基于OpenJDK源代码(http://hg.openjdk.java.net/)的结论。
如果不考虑对USDT探针的HotSpot支持(dtrace指南中描述了系统跟踪信息)和JVM属性,ConvertYieldToSleep
则的源代码yield()
几乎相同。请参阅下面的说明。
Java 9:
Thread.yield()
调用特定
于OS的方法os::naked_yield()
:
在Linux上:
void os::naked_yield() {
sched_yield();
}
在Windows上:
void os::naked_yield() {
SwitchToThread();
}
Java 8和更早版本:
Thread.yield()
调用特定
于OS的方法os::yield()
:
在Linux上:
void os::yield() {
sched_yield();
}
在Windows上:
void os::yield() { os::NakedYield(); }
如您所见,Thread.yeald()
Linux在所有Java版本上都是相同的。
让我们来看一下os::NakedYield()
JDK 8中的Windows :
os::YieldResult os::NakedYield() {
// Use either SwitchToThread() or Sleep(0)
// Consider passing back the return value from SwitchToThread().
if (os::Kernel32Dll::SwitchToThreadAvailable()) {
return SwitchToThread() ? os::YIELD_SWITCHED : os::YIELD_NONEREADY ;
} else {
Sleep(0);
}
return os::YIELD_UNKNOWN ;
}
Java 9和Java 8之间的区别在于,额外检查了Win32 API SwitchToThread()
方法的存在。Java 6中存在相同的代码。JDK7中的
源代码os::NakedYield()
略有不同,但是具有相同的行为:
os::YieldResult os::NakedYield() {
// Use either SwitchToThread() or Sleep(0)
// Consider passing back the return value from SwitchToThread().
// We use GetProcAddress() as ancient Win9X versions of windows doen't support SwitchToThread.
// In that case we revert to Sleep(0).
static volatile STTSignature stt = (STTSignature) 1 ;
if (stt == ((STTSignature) 1)) {
stt = (STTSignature) ::GetProcAddress (LoadLibrary ("Kernel32.dll"), "SwitchToThread") ;
// It's OK if threads race during initialization as the operation above is idempotent.
}
if (stt != NULL) {
return (*stt)() ? os::YIELD_SWITCHED : os::YIELD_NONEREADY ;
} else {
Sleep (0) ;
}
return os::YIELD_UNKNOWN ;
}
SwitchToThread()
由于Windows XP和Windows Server 2003提供了可用的方法,因此删除了其他检查(请参阅msdn注释)。