在Java中,wait()
和 sleep()
是两个不同的方法,用于线程控制和同步。它们有以下几个主要区别:
-
使用的位置和目的:
wait()
方法是Object
类的方法,用于线程间的协作和同步。它通常在锁定的对象上调用,并使当前线程进入等待状态,直到其他线程通知或中断它。wait()
方法必须在同步代码块或同步方法中被调用。sleep()
方法是Thread
类的静态方法,用于线程的暂停一段指定的时间。它没有同步的概念,可以在任何地方调用。
-
锁的释放:
- 在调用
wait()
方法时,当前线程会释放它所持有的锁,并进入等待状态,直到其他线程通过notify()
或notifyAll()
方法来唤醒它,并再次获得锁。 - 在调用
sleep()
方法时,线程仍会保持它所持有的锁。
- 在调用
-
异常抛出:
wait()
方法必须要被放在try-catch
块中或者抛出异常,因为它可能会抛出InterruptedException
异常。sleep()
方法也可能抛出InterruptedException
异常,但它可以选择不处理该异常。
-
时间单位和参数:
wait()
方法不带时间参数,其等待时间由其他线程的通知来确定。sleep()
方法带有毫秒级或纳秒级的时间参数,用于指定线程暂停的时间长度。
综上所述,wait()
方法常用于线程的协作和同步,与锁对象配合使用,而 sleep()
方法主要用于线程的暂停,暂停的时间可以是指定的固定时间。