`sleep()` 和 `wait()` 都是 Java 中用于线程控制的方法,它们有几点不同之处:
1. 所属类不同:
`sleep()` 是 `Thread` 类的静态方法,用于使当前线程休眠指定的时间。
`wait()` 是 `Object` 类的方法,用于在对象上等待,它会释放对象的锁。
2. 使用方式不同:
`sleep()` 方法会让当前线程休眠指定的时间,在这段时间内不会释放任何锁,即使当前线程持有锁,其他线程也无法获得锁。
`wait()` 方法用于线程间的通信,当一个线程调用了某个对象的 `wait()` 方法后,它会释放对象的锁,同时进入等待状态,直到其他线程调用相同对象的 `notify()` 或 `notifyAll()` 方法唤醒它。
3. 调用条件不同:
`sleep()` 可以在任何地方调用,不依赖于对象的锁,只是让当前线程休眠一段时间。
`wait()` 必须在同步块或同步方法中调用,因为调用 `wait()` 方法前,线程必须拥有对象的锁,否则会抛出 `IllegalMonitorStateException` 异常。
4. 唤醒方式不同:
线程调用 `sleep()` 方法后,在指定时间后会自动恢复执行。
调用 `wait()` 方法后,需要等待其他线程调用相同对象的 `notify()` 或 `notifyAll()` 方法来唤醒等待的线程。
总的来说,`sleep()` 用于线程休眠,不释放锁;而 `wait()` 用于线程间的等待和通信,在等待时会释放锁,直到被唤醒后才重新竞争锁。