在 Java 中,sleep()
和 wait()
是两种用于控制线程行为的方法,但它们的功能和用法有显著区别。了解这些差异有助于编写高效的多线程应用程序。
sleep()
Thread.sleep()
是一个静态方法,用于将当前线程暂停执行一段指定的时间。
特点
- 静态方法:属于
Thread
类,通过类名调用。 - 不释放锁:调用
sleep()
不会释放线程持有的锁或监视器。 - 时间控制:暂停当前线程一段时间(以毫秒为单位)。
- 自动恢复:到达指定时间后,线程自动恢复执行,不需要任何通知。
- 异常处理:必须处理
InterruptedException
,因为线程在休眠期间可能被中断。 - 适用场景:用于实现简单的定时功能,或让线程暂时停止执行。
wait()
Object.wait()
是一个实例方法,用于将线程置于等待状态,直到接收到通知或被中断。
特点
- 实例方法:属于
Object
类,必须在同步方法或同步块中调用。 - 释放锁:调用
wait()
会释放当前对象的锁,使其他线程可以进入同步块。 - 需要通知:线程进入等待状态,直到另一个线程调用相同对象上的
notify()
或notifyAll()
。 - 异常处理:必须处理
InterruptedException
,因为线程在等待期间可能被中断。 - 适用场景:用于线程间的通信,特别是生产者-消费者问题。