📜  Javawait和sleep的区别(1)

📅  最后修改于: 2023-12-03 15:31:48.996000             🧑  作者: Mango

Java的wait和sleep的区别

在Java中,wait和sleep都是用于线程控制的方法。但是它们的使用场景以及实现机制是不同的。

1. wait

wait方法是Object类中的方法,它通常在synchronized块内部使用。它使线程进入等待状态,并且释放锁。当其他线程调用notify或notifyAll方法时,它会被唤醒。

1.1 实现
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);
}
1.2 使用场景

wait方法适用于协调线程之间的操作,例如线程之间的通信。在生产者-消费者模型中,当缓冲区已满或者空时,生产者或者消费者线程会调用wait方法,等待缓冲区的状态发生变化。

2. sleep

sleep方法是Thread类的静态方法,用于暂停线程的执行一段时间,单位是毫秒。它不会释放锁,线程处于阻塞状态。当指定的时间过去后,线程会被唤醒,继续执行。

2.1 实现
public static void sleep(long millis) throws InterruptedException {
    sleep(millis, 0);
}

public static native void sleep(long millis, int nanos) throws InterruptedException;
2.2 使用场景

sleep方法适用于一段时间的延迟执行,例如延迟执行任务,定时执行任务。

3. 区别
  • wait方法是Object类中的方法,sleep方法是Thread类中的静态方法。
  • wait方法需要在synchronized块内部使用,它会释放锁;sleep方法不需要在synchronized块内部使用,它不会释放锁。
  • wait方法需要在notify或notifyAll方法的唤醒下才会被唤醒;sleep方法在指定时间过后自动唤醒。
  • wait方法适用于线程之间的通信和协调;sleep方法适用于一段时间的延迟执行和定时执行任务。

总体来说,wait和sleep都是用于线程控制的方法,但是它们的使用场景和实现机制是不同的,需要根据需求进行选择。