文
章
目
录
章
目
录
Java面试题:说说Java多线程中wait()和sleep()的区别?
得分点:
所属的类型不同、对锁的依赖不同、返回的条件不同
标准回答:
wait()
和sleep()
方法在多线程编程中有一些关键区别,包括它们所属的类型、对锁的依赖以及返回的条件。
- 所属的类型不同:
wait()
是Object
类的实例方法,只能在对象级别上调用。当线程调用wait()
方法时,它会进入WAITING
状态。sleep()
是Thread
类的静态方法,可以在任何地方调用。当线程调用sleep()
方法时,它会进入TIMED_WAITING
状态。
- 对锁的依赖不同:
wait()
方法依赖于同步锁,通常在synchronized
块或方法内部调用。当线程调用wait()
方法时,它会释放持有的锁,允许其他线程进入临界区。sleep()
方法不依赖于任何锁,它可以在任何地方使用,不会释放任何锁。
- 返回的条件不同:
- 调用
wait()
方法使线程进入等待状态,需要被其他线程通过notify()
或notifyAll()
方法唤醒,从而返回到可运行状态。 - 调用
sleep()
方法使线程进入超时等待状态,可以在指定的时间后自动返回可运行状态,不需要外部唤醒。
- 调用
此外,wait()
方法还支持带超时参数的形式,这将使线程进入TIMED_WAITING
状态。在这种情况下,线程可以通过超时或者被其他线程调用notify()
或notifyAll()
方法唤醒。
当使用Lock
进行线程同步时,没有同步监视器的概念,此时需要使用Condition
对象的方法来实现等待。Condition
对象是通过Lock
对象创建的,它的await()
方法会导致线程进入WAITING
状态,而带有超时参数的await()
方法会导致线程进入TIMED_WAITING
状态。当调用signal()
或signalAll()
方法时,线程将被唤醒并返回可运行状态。这种方式适用于使用Lock
进行线程同步的情况。