美文网首页
wait与sleep的区别

wait与sleep的区别

作者: ZMRWEGo | 来源:发表于2019-08-20 16:53 被阅读0次

    wait和sleep是java多线程中常用的两个方法,下面看一看两者之间到底有什么区别。

    1. 使用限制

    使用 sleep 方法可以让让当前线程休眠,时间一到当前线程继续往下执行,在任何地方都能使用,但需要捕获 InterruptedException 异常。

    try {
        Thread.sleep(3000L);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    

    而使用 wait 方法则必须放在 synchronized 块里面,同样需要捕获 InterruptedException 异常,并且需要获取对象的锁。

    synchronized (lock){
        try {
            lock.wait();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    

    而且 wait 还需要额外的方法 notify/ notifyAll 进行唤醒,它们同样需要放在 synchronized 块里面,且获取对象的锁。。

    synchronized (lock) {
        // 随机唤醒
        lock.notify();
        
        // 唤醒全部
        lock.notifyAll();
    }
    

    当然也可以使用带时间的 wait(long millis) 方法,时间一到,无需其他线程唤醒,也会重新竞争获取对象的锁继续执行。

    2. 使用场景

    sleep 一般用于当前线程休眠,或者轮循暂停操作,wait 则多用于多线程之间的通信。

    3. 所属类

    sleep是Thread类的静态本地方法,wait是Object类的本地方法
    sleep是让当前线程休眠,不涉及到对象类以及对象类的锁。wait是让获得到对象锁的线程实现等待,所以是类的方法

    4. 释放锁

    Object lock = new Object();
    synchronized (lock) {
        try {
            lock.wait(3000L);
            Thread.sleep(2000L);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    

    wait会释放当前线程对lock对象持有的锁,而sleep则不会。

    5. 线程切换

    sleep 会让出 CPU 执行时间且强制上下文切换,而 wait 则不一定,wait 后可能还是有机会重新竞争到锁继续执行的。

    相关文章

      网友评论

          本文标题:wait与sleep的区别

          本文链接:https://www.haomeiwen.com/subject/yxipsctx.html