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
发布评论