sleep 方法和 wait 方法有什么区别?

sleep()wait()方法都可以让线程暂停执行,但它们之间有一些关键区别:

  1. 来源:sleep()方法是Thread类的静态方法,而wait()方法是Object类的实例方法。这意味着所有Java对象都可以调用wait()方法,而只有Thread类及其子类可以调用sleep()方法。

  2. 锁释放:当线程调用sleep()方法时,它不会释放已经持有的任何对象锁。因此,如果线程在调用sleep()之前获取了锁,其他线程将无法访问受该锁保护的资源,直到睡眠时间结束。而当线程调用wait()方法时,它会释放持有的对象锁,允许其他线程访问受锁保护的资源。

  3. 唤醒机制:sleep()方法在指定的时间(毫秒)后自动唤醒线程。而wait()方法需要依赖其他线程调用相同对象的notify()notifyAll()方法来唤醒等待的线程。如果没有其他线程调用这些方法,调用wait()的线程将一直等待下去。

  4. 使用场景:sleep()方法通常用于让线程暂停执行一段时间,以便其他线程执行或等待某些条件成熟。例如,在轮询某一资源时,可以让线程每隔一段时间检查一次资源状态。而wait()方法通常用于线程间的协作,一个线程在等待某个条件满足时调用wait()进入等待状态,而另一个线程在条件满足时调用notify()notifyAll()来唤醒等待的线程。

举个例子,假设有两个线程A和B。线程A负责生产数据,线程B负责消费数据。当数据队列为空时,线程B需要等待线程A生产数据。这时,线程B可以调用wait()方法进入等待状态,并释放锁,以便线程A可以生产数据。当线程A生产完数据后,调用notify()notifyAll()方法唤醒线程B,线程B可以继续消费数据。

发表评论

后才能评论