sleep 方法和 wait 方法有什么区别?
sleep()
和wait()
方法都可以让线程暂停执行,但它们之间有一些关键区别:
- 来源:
sleep()
方法是Thread
类的静态方法,而wait()
方法是Object
类的实例方法。这意味着所有Java对象都可以调用wait()
方法,而只有Thread
类及其子类可以调用sleep()
方法。 -
锁释放:当线程调用
sleep()
方法时,它不会释放已经持有的任何对象锁。因此,如果线程在调用sleep()
之前获取了锁,其他线程将无法访问受该锁保护的资源,直到睡眠时间结束。而当线程调用wait()
方法时,它会释放持有的对象锁,允许其他线程访问受锁保护的资源。 -
唤醒机制:
sleep()
方法在指定的时间(毫秒)后自动唤醒线程。而wait()
方法需要依赖其他线程调用相同对象的notify()
或notifyAll()
方法来唤醒等待的线程。如果没有其他线程调用这些方法,调用wait()
的线程将一直等待下去。 -
使用场景:
sleep()
方法通常用于让线程暂停执行一段时间,以便其他线程执行或等待某些条件成熟。例如,在轮询某一资源时,可以让线程每隔一段时间检查一次资源状态。而wait()
方法通常用于线程间的协作,一个线程在等待某个条件满足时调用wait()
进入等待状态,而另一个线程在条件满足时调用notify()
或notifyAll()
来唤醒等待的线程。
举个例子,假设有两个线程A和B。线程A负责生产数据,线程B负责消费数据。当数据队列为空时,线程B需要等待线程A生产数据。这时,线程B可以调用wait()
方法进入等待状态,并释放锁,以便线程A可以生产数据。当线程A生产完数据后,调用notify()
或notifyAll()
方法唤醒线程B,线程B可以继续消费数据。