wait(): 死等,直到被唤醒或中断
- 概念:使得当前线程立刻停止运行,处于等待状态。并将当前线程置入锁对象的等待队列中,直到被通知(notify())或被中断为止。
- 使用条件:只能在同步方法或同步代码块中使用,必须是内建锁。
- wait()调用后立刻释放对象锁。
public final native void wait(long timeout)throws InterruptedException
超时等待。若在规定时间内未被唤醒则线程退出,单位是毫秒
notify():
public final native void notify()
- 概念:唤醒处于等待状态的线程
- 使用条件:必须在同步方法或同步代码块中使用,用来唤醒等待该对象的其他线程,若有多个线程在等待,随机挑选一个唤醒
- notify()方法调用后,当前线程不会立马释放对象锁,要等到当前线程执行完毕后在释放锁
notifyAll(): 唤醒所有处于等待队列头部的线程,从队列尾唤醒到队列头
每个锁对象都有两个队列,同步队列和等待队列
- 同步队列:存储获取锁失败的线程
- 等待队列:存储调用wait的线程
调用nitify方法唤醒线程就是将线程从等待队列移到同步队列中,与其他线程竞争获取锁
线程从运行到阻塞的几种情况:
- 调用sleep(),立即交出CPU,但不会释放对象锁
- 线程获取锁失败
- 线程调用阻塞式IO
- 线程调用wait()
- 线程susped(),将线程挂起