sleep 和 wait的区别
你好,我是猿java。
在计算机编程中,特别是在多线程或并发编程中,sleep
和 wait
是两个非常常见的函数,但它们有不同的用途和工作机制,这篇文章我们将详细地讨论 sleep
和 wait
的区别,包括它们的内部工作原理、应用场景以及详细的示例代码,以帮助更全面地理解它们。
sleep
工作机制
- 暂停当前线程:
sleep
方法暂停当前执行的线程一段指定的时间,时间结束后线程再恢复执行。 - 不会释放锁: 即使线程在
sleep
状态下持有锁,它也不会释放。它依然占用着该锁,其他线程无法获得该锁。 - 线程状态转换:
sleep
方法会使线程从运行(RUNNING)状态转换为计时等待(TIMED_WAITING)状态。 - 静态方法: 它是
Thread
类的静态方法,调用时通过Thread.sleep
访问。
应用场景
- 限流: 控制任务执行的频率,防止线程过度占用CPU资源。
- 定时任务: 在某个循环中,定时执行某些任务。
示例代码
1 | public class SleepExample extends Thread { |
wait
工作机制
- 释放锁并等待通知:
wait
方法使当前线程等待,直到其他线程调用当前对象的notify
或notifyAll
方法。调用wait
时,线程会释放它持有的锁。 - 必须在同步块或同步方法中使用:
wait
方法必须在同步块或同步方法中调用,否则会抛出IllegalMonitorStateException
。 - 线程状态转换:
wait
方法会使线程从运行(RUNNING)状态转换为等待(WAITING)状态。 - 对象方法: 它是
Object
类的方法,所以任何对象都可以调用。
应用场景
- 线程间通信: 多个线程协同工作时,一个线程等待某个条件满足后,再被其他线程通知继续执行。
- 生产者-消费者模型: 经常用于实现生产者-消费者模式中的同步。
示例代码
1 | public class WaitNotifyExample { |
sleep 和 wait的对比
特性 | sleep |
wait |
---|---|---|
释放锁 | 否 | 是 |
需要在同步块或方法中 | 否 | 是 |
属于 | Thread 类 |
Object 类 |
引发异常 | InterruptedException |
InterruptedException 引发机制相同 |
作用范围 | 当前调用的线程 | 当前拥有锁的线程 |
线程状态改变 | 变为计时等待(TIMED_WAITING) | 变为等待(WAITING) |
典型应用场景 | 暂停线程的一段时间,用于控制节奏或定时操作 | 线程间通信,生产者-消费者模型等 |
总结
本文,我们分析了sleep
和 wait
,sleep
用于暂停当前线程一段指定时间,但仍保持锁,这常用来控制执行节奏或定时操作。wait
使线程释放锁并进入等待状态,直到通过 notify/notifyAll 被唤醒,需在同步块中使用,适用于线程间通信如生产者-消费者模型。
学习交流
如果你觉得文章有帮助,请帮忙转发给更多的好友,或关注公众号:猿java,持续输出硬核文章。