快捷搜索: 王者荣耀 脱发

Java 中wait()与sleep()方法的区别

Java 中wait()与sleep()方法

一、wait()

wait()方法的作用是让获取到锁的线程释放锁并进入等待阻塞。所以wait()方法必须在获取到锁时才可调用,否则会抛出异常,例:

public class Test{
​
    public static void main(String[] args) throws InterruptedException {
        Test test = new Test();
        test.wait();
    }
}

输出:

wait调用时可以指定等待最长多久,否则线程将会无限制等待,直到被notify或notifyAll方法唤醒。

wait方法的使用场景:wait方法通常用于需要某个资源才能继续执行代码,且该资源是通过其它线程获取锁并准备的。此时可以释放锁并加入等待。通常结构如下:

synchronized(lock) {
     while(条件不成立) {
         lock.wait();
     }
    // 条件成立了,干活
}
​
// 另一个线程
synchronized(lock) {
    // 准备资源
    lock.notifyAll();
}
​

二、sleep()

    sleep()方法会让当前线程进入阻塞; 如果当前线程占有某个锁,sleep进入阻塞时不会释放锁; sleep方法的调用必须指定睡眠时间; sleep方法是Thread上的静态方法。

三、wait()与sleep()的区别

    wait进入的线程必须通过notify或notifyAll方法唤醒。 wait方法的调用需要当前线程获取到锁,即在synchronized方法中才能调用。 wait方法是Object中的实例方法,sleep是Thread中的静态方法。 wait方法会使当前线程释放锁,再进入阻塞等待,而sleep不会释放锁。
经验分享 程序员 微信小程序 职场和发展