同学你好:
首先我们可以看一看 sleep 和 wait 的区别:
(1)wait() 是 Object 中定义的 native 方法
public final native void wait(long timeout) throws InterruptedException;
所以每一个类的实例都可以调用这个方法。wait() 只能在 synchronized block 中调用。它会释放synchronized 时加在 object 上的锁。
(2)sleep() 是定义在 Thread 中的 native 静态类方法
public static native void sleep(long millis) throws InterruptedException;
所以 Thread.sleep() 可以在任何情况下调用。Thread.sleep() 将会暂停当前线程,并且不会释放任何锁资源。
(3)sleep() 方法自带 sleep 时间,时间过后,Thread 会自动被唤醒。
或者可以通过调用 interrupt() 方法来中断。相比而言 wait 的唤醒会比较复杂,我们需要调用 notify() 和 notifyAll() 方法来唤醒等待在特定 wait object 上的线程。
对于它们适用的场景,我们需要知道:wait 的使用更像事件监听机制,工作线程监听某个事件(如任务队列),事件到达后通知工作线程,而 sleep 的使用更像轮询机制,不断的轮询任务队列中是否又任务。在处理任务队列这个场景上使用 wait 更优一些。
所以,总结下来,它们各自适用的场景也就很清晰了:
(1)wait 适用于“生产者-消费者”模式,是由于某种状态没达成而导致的等待-唤醒过程
(2)sleep 则适用于停顿执行的轮询场景,因为某种状态达不到,可以稍等一会再去获取状态判断
我是勤一,致力于将这门课程的问答区打造为 Java 知识体系知识库,Java 知识体系 BBS!共同建造、维护这门课程,我需要每一个你!