一、共同点
- 都可以使线程暂停执行: wait() 方法和 sleep() 方法都可以使当前线程暂停执行一段时间。
- 都可以用于多线程编程: 无论是 wait() 还是 sleep(),都可以在多线程环境中使用。
- 都可以在同步块或同步方法中使用: wait() 方法通常与 synchronized 关键字一起使用,因为它需要在同步块或同步方法中调用。而 sleep() 方法可以在任何地方使用,不受同步的限制。
- 都可以捕获 InterruptedException 异常: 调用 wait() 或 sleep() 方法时,都可能抛出 InterruptedException 异常,因此在使用这两个方法时都需要处理这个异常。
二、不同点
sleep | wait | |
---|---|---|
所属类 | Thread 线程类 | Object 顶级类 |
方法类型 | 静态方法 | 普通方法 |
释放对象锁 | 否 | 是 |
调用后状态 | 让出CPU给其他线程,但是他的监控状态依然保持 | 进入等待此对象的等待锁定池 |
恢复运行条件 | 设定的时间到后自动苏醒 | 未指定超时时间时,不会自动苏醒,需要别的线程调用同一个对象上的 notify() 或者 notifyAll() 方法,本线程才进入对象锁定池准备获取对象锁从而进入运行状态;指定了超时时间wait(long timeout) 时,超时后线程会自动苏醒。 |
应用场景 | 可以在任何地方使用 | 只能在同步方法或者同步块中使用。 |
sleep(time)所设定的时间到后,线程不一定立即苏醒,这是由于CPU的调度原因,线程恢复运行后会进入就绪状态,CPU不一定会立刻分配时间片给该线程,因此,线程苏醒后将会在
≥time
的时间运行。即:假设调用sleep(1000),线程将会在≥1000ms后继续运行。
注意,wait()在接收到针对此对象的
notify()
或者notifyAll()
方法后,是准备获取对象锁,进入运行状态,而不是立即获得。