Thread.sleep(0)有什么用?直观理解和yield()语义一致。
翻阅Java8的语言规范,官方给出的解释如下:
大致意思就是说:java语言规范不希望yiled和spleep(0)具有很强的明确语义,可以不用实现他们。
也就是说JVM可以自由地去实现他们,可以不做任何操作,也可以给系统调度器提示。特别说下,sleep(0)在Unix系统下的语义是:把线程 放到运行队列的末尾,并让出执行权给其它同优先级的线程,很多JVM也是这么实现的 ,但不要求这么实现。
最后看看Hotspot是怎么实现的,代码见截图。
ConvertSleepToYield的默认值为true,所以在hotspot中当sleep(0)时效果相当于yield()。会让当前线程放弃剩余时间片,进入相同优先级线程队列的队尾,只有排在前面的所有同优先级线程完成调度后,它才能再次获执行的机会。
翻阅Java8的语言规范,官方给出的解释如下:
大致意思就是说:java语言规范不希望yiled和spleep(0)具有很强的明确语义,可以不用实现他们。
也就是说JVM可以自由地去实现他们,可以不做任何操作,也可以给系统调度器提示。特别说下,sleep(0)在Unix系统下的语义是:把线程 放到运行队列的末尾,并让出执行权给其它同优先级的线程,很多JVM也是这么实现的 ,但不要求这么实现。
最后看看Hotspot是怎么实现的,代码见截图。
ConvertSleepToYield的默认值为true,所以在hotspot中当sleep(0)时效果相当于yield()。会让当前线程放弃剩余时间片,进入相同优先级线程队列的队尾,只有排在前面的所有同优先级线程完成调度后,它才能再次获执行的机会。