"wait/notify"机制:等待/通知机制,wait使线程暂停运行,而notify 使暂停的线程继续运行
使用wait ,notify 和 notifyAll 时需要先对调用对象加锁
- 调用wait 方法后,线程状态有 Running 变为 Waiting,并将当前线程放置到对象的 等待队列
- notify或者 notifyAll 方法调用后, 等待线程依旧不会从 wait 返回,需要调用 noitfy 的线程释放锁之后,等待线程才有机会从 wait 返回
- notify方法将等待队列的一个等待线程从等待队列种移到同步队列中,而 notifyAll 方法则是将等待队列种所有的线程全部移到同步队列,被移动的线程状态由 Waiting 变为 Blocked
- 从 wait 方法返回的前提是获得了调用对象的锁
多线程中wait和sleep方法的区别
- wait是Object的方法,而sleep是Thread的方法
- sleep方法不会释放锁,时间过后会自动唤醒或interrupt强行打断
wait方法会释放锁,可以设置超时时间,时间过后自动唤醒或其他线程调用notify/notifyAll - wait、notify、notifyAll只能在同步控制方法或同步控制块中使用,而sleep可以任何地方使用
- sleep必须捕获异常(InterruptedException),wait、notify、notifyAll则不用