sleep()
和 wait()
常考面试题共同点:两者都可以暂停线程的执行。
区别:
sleep()
方法没有释放锁,而 wait()
方法释放了锁,也就是 wait()
方法是必须配合锁机制执行的。
wait()
通常被用于线程间交互/通信,sleep()
通常被用于暂停执行。
wait()
方法被调用后,线程不会自动苏醒,需要别的线程调用同一个对象上的 notify()
或者 notifyAll()
方法。sleep()
方法执行完成后,线程会自动苏醒,或者也可以使用 wait(long timeout)
超时后线程会自动苏醒。
sleep()
是 Thread
类的静态本地方法,wait()
则是 Object
类的本地方法。为什么这样设计呢?下一个问题就会聊到。
wait()
是让获得对象锁的线程实现等待,会自动释放当前线程占有的对象锁。每个对象(Object
)都拥有对象锁,既然要释放当前线程占有的对象锁并让其进入 WAITING 状态,自然是要操作对应的对象(Object
)而非当前的线程(Thread
)。
类似的问题:为什么 sleep()
方法定义在 Thread
中?
因为 sleep()
是让当前线程暂停执行,不涉及到对象类,也不需要获得对象锁。
wait()
和 notify()
机制wait()
和 notify()
机制是由 Monitor 锁机制提供的
wait()
方法会释放对象的锁,进入 WaitSet 等待区,从而让其他线程就机会获取对象的锁。无限制等待,直到 notify 为止