1. 所属类和用途
- wait():
- 所属类:
Object
类。 - 用途:主要用于线程间的通信和同步。
wait()
和notify()
/notifyAll()
方法必须与synchronized
关键字一起使用,以确保线程间的同步(线程之间必须按照特定的顺序执行)。当线程调用某个对象的wait()
方法时,它会释放该对象上的锁并进入等待状态,直到其他线程调用该对象的notify()
或notifyAll()
方法将其唤醒,或者等待时间超时(如果调用了带超时的wait(long timeout)
方法)。
- 所属类:
- sleep():
- 所属类:
Thread
类。 - 用途:主要用于暂停当前线程的执行一段时间,让出CPU资源给其他线程使用。它不涉及线程间的通信,仅仅是让线程暂停执行。
- 所属类:
2. 对锁的处理
- wait():
- 调用
wait()
方法时,当前线程必须持有该对象的锁。调用后,线程会释放该锁并进入等待状态。当线程被唤醒并准备重新执行时,它需要重新获取该对象的锁。
- 调用
- sleep():
sleep()
方法不会释放当前线程所持有的任何锁。即使线程在睡眠期间被暂停执行,它所持有的锁仍然保持有效,其他线程无法进入该锁保护的同步代码块。
3. 使用范围
- wait():
- 必须在同步方法或同步代码块内部调用,因为它涉及到线程间的通信和锁的释放。
- sleep():
- 可以在任何地方调用,无需同步代码块的支持。它仅仅是让当前线程暂停执行一段时间,不涉及线程间的通信或锁的管理。
4. 唤醒机制
- wait():
- 线程调用
wait()
方法后会进入等待状态,直到其他线程调用该对象的notify()
或notifyAll()
方法将其唤醒。如果没有其他线程唤醒它,它将一直等待下去(除非设置了超时时间)。
- 线程调用
- sleep():
- 线程调用
sleep()
方法后会暂停执行指定的时间,然后自动苏醒并继续执行后续的代码。它不需要其他线程的干预来唤醒。
- 线程调用
5. 异常处理
- wait():
wait()
方法在调用时不需要捕获异常,但如果在等待过程中线程被中断(即调用了线程的interrupt()
方法),则会抛出InterruptedException
异常。
- sleep():
sleep()
方法在调用时必须捕获InterruptedException
异常,因为如果在睡眠过程中线程被中断,则会抛出此异常。
6. 返回值
- wait():
wait()
方法没有返回值。
- sleep():
sleep()
方法本身不返回任何值,但会抛出InterruptedException
异常。