sleep,wait方法的对比
wait | sleep | |
---|---|---|
同步 | 只能在同步上下文中调用wait方法,否则或抛出IllegalMonitorStateException异常 | 不需要在同步方法或同步块中调用 |
作用对象 | wait方法定义在Object类中,作用于对象本身 | sleep方法定义在java.lang.Thread中,作用于当前线程 |
释放锁资源 | 是 | 否 |
唤醒条件 | 其他线程调用对象的notify()或者notifyAll()方法 | 超时或者调用interrupt()方法体 |
方法属性 | wait是实例方法 | sleep是静态方法 |
两者都需要捕获InterruptedException
- A线程占用了对象的锁,其他线程进入synchronized块要获取这个这个对象的锁时,由于对象锁被占用,所以让其他线程进入阻塞状态,进入同步队列等锁的释放。
- 当占有锁的A线程调用某对象的wait方法,线程会进入等待队列,同时释放锁。等到其他其他线程调用这个对象的notify/notifyAll方法时,A线程才重新进入synchronized同步队列去等待锁,此时状态也是阻塞状态
sleep,wait使用场景的区别:
Sleep一般用于使当前线程进入阻塞状态并且继续持有锁,一般是让线程等待。
wait一般用于多线程之间的通信,需要配合notify或者notifyall来进行使用,例如:生产者,消费者模式就需要使用wait,notify方法