在 Java 并发编程中,wait()
方法和 sleep()
方法确实都能够让当前线程挂起一段时间,但它们在使用场景、目的和效果上存在一些关键的区别:
1. 所属的类不同
wait()
方法是Object
类的一部分,也就是说,所有的 Java 对象都可以调用wait()
方法。sleep()
方法是Thread
类的静态方法。
2. 释放锁
wait()
方法在挂起线程的同时,会释放当前对象上的锁(如果当前线程是锁的持有者)。sleep()
方法在挂起线程时不会释放任何锁。
3. 异常处理
wait()
方法必须放在同步代码块或同步方法中调用,否则会抛出IllegalMonitorStateException
。当等待时间结束后,线程会自动重新尝试获取锁。sleep()
方法不需要放在同步代码块中,并且在睡眠时间结束后,线程会自动回到就绪状态。如果被中断,sleep()
方法会抛出InterruptedException
。
4. 使用场景
wait()
方法通常用于线程间的通信,它允许线程在某个条件下等待,直到其他线程执行特定操作(如通知)。sleep()
方法主要用于模拟延迟、暂停执行等场景,不涉及线程间的通信。
5. 通知机制
wait()
方法配合notify()
或notifyAll()
方法使用,允许线程在满足某些条件时被唤醒。sleep()
方法没有通知机制,线程会在指定的睡眠时间结束后自动唤醒。
以下是简要的对比:
wait():
- Object 类方法
- 释放锁
- 需要在同步块中使用
- 配合 notify/notifyAll 使用
- 用于线程间通信
sleep():
- Thread 类静态方法
- 不释放锁
- 不需要在同步块中使用
- 用于暂停执行
- 没有通知机制
理解这些区别对于正确使用 Java 并发编程至关重要。