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