현재 답변이 오래되었으며 최근 변경 사항에 따라 수정해야합니다.
6-9 이후 Java 버전간에 실질적인 차이 는 없습니다 Thread.yield()
.
TL; DR;
OpenJDK 소스 코드 ( http://hg.openjdk.java.net/ ) 에 기반한 결론입니다 .
USDT 프로브 (시스템 추적 정보는 dtrace 가이드에 설명되어 있음 ) 및 JVM 속성의 HotSpot 지원을 고려하지 않으면의 ConvertYieldToSleep
소스 코드 yield()
는 거의 동일합니다. 아래 설명을 참조하십시오.
자바 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 버전이 동일합니다. JDK 8에서
Windows를 살펴 보겠습니다 os::NakedYield()
.
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 ;
}
Win32 API SwitchToThread()
메서드 의 존재에 대한 추가 검사에서 Java 9와 Java 8의 차이점 . Java 6에도 동일한 코드가 있습니다 . JDK 7
의 소스 코드 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 참고 사항 참조 ).