请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

java中 sleep 和 wait方法的区别?

java中 sleep 和 wait方法的区别?
为什么wait方法是定义在Object类里的,而不是定义在Thread类里?
wait和sleep方法的使用场景有什么不同?

正在回答

1回答

张勤一 2020-09-16 19:19:38

同学你好:

    首先我们可以看一看 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!共同建造、维护这门课程,我需要每一个你!


3 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信