Thread的sleep()和Object的wait()

  • sleep()wait()都是用来让线程暂停执行的方法,但是它们有一些重要的区别。

1. 共同点与不同点

  • 共同点:两者都可以暂停进程的执行
  • 不同点:
    • sleep()方法没有释放锁,而wait()方法会释放锁
    • wait()通常用于线程间交互/通信,而sleep()通常用于让线程暂停执行
    • wait()方法调用后线程不会自动苏醒,需要别的线程调用同一个对象上的notifuy()notifyAll()方法来唤醒,而sleep()方法调用后线程会自动苏醒,或者也可以使用wait(long timeout)方法让线程在指定时间后自动苏醒
    • sleep()Thread类的静态方法,而wait()Object类的实例方法

2. 为什么wait()方法不定义在Thread类中

  • wait()是让获得对象锁的线程实现等待,会自动释放当前线程占有的对象锁。每个对象Object都有对象锁,既然要释放当前线程占有的对象锁并让其进入WAITING状态,自然要操作对应的对象Object而非当前的线程Thread

  • 为什么sleep()定义在Thread中:sleep()是让当前线程暂停执行,并不涉及对象类,也不需要获得对象锁。