-XX:+DontYieldALotInterval; bool;Interval in milliseconds between yields. (debug
only)
Thread.yield 是个 native 方法,具体由 JVM 实现,JVM 实现的源代码为:
C/C++ code
JVM_ENTRY(void, JVM_Yield(JNIEnv *env, jclass threadClass))
JVMWrapper("JVM_Yield");
if (os::dont_yield()) return;
HS_DTRACE_PROBE0(hotspot, thread__yield);
// When ConvertYieldToSleep is off (default), this matches the classic VM use of yield.
// Critical for similar threading behaviour
if (ConvertYieldToSleep) {
os::sleep(thread, MinSleepInterval, false);
} else {
os::yield();
}
JVM_END
这个函数首先会调用 os::dont_yield() 函数,这个函数根据不同平台版本的 JVM 实现,有着不同的意义。
这个函数的调用结果是由一个称为 DontYieldALot 的 HotSpot JVM 参数决定的,这个参数在 Windows 和 Linux 平台上默认值为 false,在 Solaris 平台上默认值为 true。
1:在 Solaris 平台上的实现是:
Java code
bool os::dont_yield() {
if (DontYieldALot) {
static hrtime_t last_time = 0;
hrtime_t diff = getTimeNanos() - last_time;
if (diff < DontYieldALotInterval * 1000000)
return true;
last_time += diff;
return false;
}
else {
return false;
}
}
如果在 JVM 启用时强制设置 -XX:+DontYieldALot 参数时,则 Solaris 平台上会采用 os::sleep 模拟 yield 的功能,也就是让当前线程睡觉,睡觉的时间由 -XX:MinSleepInterval=?? 决定,默认值为 1 毫秒。如果连着两次调用 yield 的话,会使用 -XX:DontYieldALotInterval=?? 进行限制,默认值为 10 毫秒。
only)
Thread.yield 是个 native 方法,具体由 JVM 实现,JVM 实现的源代码为:
C/C++ code
JVM_ENTRY(void, JVM_Yield(JNIEnv *env, jclass threadClass))
JVMWrapper("JVM_Yield");
if (os::dont_yield()) return;
HS_DTRACE_PROBE0(hotspot, thread__yield);
// When ConvertYieldToSleep is off (default), this matches the classic VM use of yield.
// Critical for similar threading behaviour
if (ConvertYieldToSleep) {
os::sleep(thread, MinSleepInterval, false);
} else {
os::yield();
}
JVM_END
这个函数首先会调用 os::dont_yield() 函数,这个函数根据不同平台版本的 JVM 实现,有着不同的意义。
这个函数的调用结果是由一个称为 DontYieldALot 的 HotSpot JVM 参数决定的,这个参数在 Windows 和 Linux 平台上默认值为 false,在 Solaris 平台上默认值为 true。
1:在 Solaris 平台上的实现是:
Java code
bool os::dont_yield() {
if (DontYieldALot) {
static hrtime_t last_time = 0;
hrtime_t diff = getTimeNanos() - last_time;
if (diff < DontYieldALotInterval * 1000000)
return true;
last_time += diff;
return false;
}
else {
return false;
}
}
如果在 JVM 启用时强制设置 -XX:+DontYieldALot 参数时,则 Solaris 平台上会采用 os::sleep 模拟 yield 的功能,也就是让当前线程睡觉,睡觉的时间由 -XX:MinSleepInterval=?? 决定,默认值为 1 毫秒。如果连着两次调用 yield 的话,会使用 -XX:DontYieldALotInterval=?? 进行限制,默认值为 10 毫秒。