Thread.sleep() 实现
今天我有一个面试,我问了候选人关于和之间的区别的非常平常和基本的问题。我本以为他会回答这样的事情,但他说这些方法基本上是一回事,很可能是在里面使用,但本身并不需要外部锁。这并不是一个正确的答案,因为在JDK 1.6中,此方法具有以下签名。Thread.sleep()
Object.wait()
Thread.sleep
Object.wait()
sleep
public static native void sleep(long millis) throws InterruptedException;
但我的第二个想法是,这并不那么荒谬。可以使用定时等待来达到相同的效果。请看以下代码片段:
public class Thread implements Runnable {
private final Object sleepLock = new Object();
// other implementation details are skipped
public static void sleep(long millis) throws InterruptedException {
synchronized (getCurrentThread().sleepLock){
getCurrentThread().sleepLock.wait(millis);
}
}
在这种情况下,是一个对象,它特别用于方法内部的同步块。我假设 Sun/Oracle 的工程师知道 Occam 的剃刀,所以有意实现原生,所以我的问题是为什么它使用原生调用。sleepLock
sleep
sleep
我想出的唯一想法是假设有人可能会发现有用的调用,例如.根据本文,对于调度程序管理是有意义的:Thread.sleep(0)
这具有清除当前线程的量程并将其置于队列末尾以达到其优先级的特殊效果。换句话说,所有具有相同优先级的可运行线程(以及具有更高优先级的线程)将有机会在下次给定 CPU 时间之前运行生成的线程。
因此,块将产生不必要的开销。synchronized
您知道在 Thread.sleep()
实现中不使用定时等待的任何其他原因吗?