📅  最后修改于: 2023-12-03 15:31:48.996000             🧑  作者: Mango
在Java中,wait和sleep都是用于线程控制的方法。但是它们的使用场景以及实现机制是不同的。
wait方法是Object类中的方法,它通常在synchronized块内部使用。它使线程进入等待状态,并且释放锁。当其他线程调用notify或notifyAll方法时,它会被唤醒。
public final void wait() throws InterruptedException {
wait(0);
}
public final native void notify();
public final native void notifyAll();
public final native void wait(long timeout) throws InterruptedException;
public final void wait(long timeout, int nanos) throws InterruptedException {
if (timeout < 0) {
throw new IllegalArgumentException(
"timeout value is negative");
}
if (nanos < 0 || nanos > 999999) {
throw new IllegalArgumentException(
"nanosecond timeout value out of range");
}
if (nanos >= 500000 || (nanos != 0 && timeout == 0)) {
timeout++;
}
wait(timeout);
}
wait方法适用于协调线程之间的操作,例如线程之间的通信。在生产者-消费者模型中,当缓冲区已满或者空时,生产者或者消费者线程会调用wait方法,等待缓冲区的状态发生变化。
sleep方法是Thread类的静态方法,用于暂停线程的执行一段时间,单位是毫秒。它不会释放锁,线程处于阻塞状态。当指定的时间过去后,线程会被唤醒,继续执行。
public static void sleep(long millis) throws InterruptedException {
sleep(millis, 0);
}
public static native void sleep(long millis, int nanos) throws InterruptedException;
sleep方法适用于一段时间的延迟执行,例如延迟执行任务,定时执行任务。
总体来说,wait和sleep都是用于线程控制的方法,但是它们的使用场景和实现机制是不同的,需要根据需求进行选择。