2024年4月28日发(作者:)

Thread类的sleep()方法和对象的wait()

方法都可以让线程暂停执行,它们有什么区别?

Thread 类的 sleep() 方法和对象的 wait() 方法都能让线程

暂停执行,但它们的使用场景和作用有很大的区别。

():

作用:

() 方法是静态方法,用于让当前线程休眠一段时

间,不释放锁。

它主要用于模拟时间的流逝,或者在一些需要等待的场景下,例

如定时任务、延时执行等。

用法:

java

Copy code

try {

(1000); // 休眠1秒钟

} catch (InterruptedException e) {

tackTrace();

}

() 和 ():

1 / 4

作用:

() 和 () 方法是实例方法,需要在

同步块中调用。它们用于实现线程间的协作,等待某个条件满足后继

续执行,通常与锁配合使用。

wait() 使当前线程进入等待状态,并释放对象锁。只有其他线

程调用相同对象的 notify() 或 notifyAll() 方法,才能唤醒等待

中的线程。

notify() 唤醒等待池中的一个线程,notifyAll() 唤醒等待池

中的所有线程。

用法:

java

Copy code

synchronized (lock) {

while (!condition) {

try {

(); // 等待条件满足

} catch (InterruptedException e) {

tackTrace();

}

}

2 / 4

// 执行线程任务

}

synchronized (lock) {

condition = true; // 修改条件

(); // 唤醒等待的线程

}

区别总结:

锁的释放:

() 不会释放任何锁,线程在睡眠期间持有相同的

锁。

() 会释放当前线程持有的对象锁,使得其他线程可

以获得这个锁。

用途:

() 主要用于让线程休眠,模拟时间流逝。

() 和 () 主要用于线程之间的协作,

实现等待和唤醒的机制。

调用方式:

() 是 Thread 类的静态方法,直接通过类名调用。

3 / 4

() 和 () 是实例方法,需要在同步

块中调用,并通过特定的对象调用。

被唤醒的条件:

() 是固定的时间后自动唤醒,不需要其他线程的

干预。

() 需要其他线程显式地调用相同对象的 notify()

或 notifyAll() 方法来唤醒。

4 / 4