sleep() 和 wait() 是 Java 中用于暂停当前线程的两个重要方法,sleep 是让当前线程休眠,不涉及对象类,也不需要获取对象的锁,属于 Thread 类的方法;wait 是让获得对象锁的线程实现等待,前提要获得对象的锁,属于 Object 类的方法。
区别如下:
- 所属类
sleep()方法属于Thread类wait()方法专属于Object类
- 锁行为
- 当线程执行
sleep()方法时,它不会释放任何锁。也就是说,如果一个线程在持有某个对象的锁时调用了 sleep,它在睡眠期间仍然会持有这个锁。 - 当线程执行
wait()方法时,它会释放 它持有的那个对象的锁,这使得其他线程可以有机会获取该对象的锁。
- 当线程执行
- 使用条件
- sleep() 方法可以在任何地方被调用
- wait() 方法必须在同步代码块或同步方法中被调用 ,这是因为调
wait()方法的前提是当前线程必须持有 对象的锁 ,否则会抛出IllegalMonitorStateException异常。
- 唤醒方式
sleep():指定时间过后,线程自动唤醒继续执行wait():需要依靠notify()、notifyAll()方法 或者wait()中指定了等待的时间到期