使用wait()、notify()和notifyAll()方法
wait():一旦执行此方法,当前线程进入阻塞状态(cpu无法给它分配行使权),并且释放同步监视器(自动释放锁)
notify():执行此方法会唤醒另一个线程,如果有多个线程被wait,就唤醒优先级最高的那个。
notifyAll():执行此方法唤醒所有wait的线程。
唤醒的意思是进入就绪状态,还要等待cpu分配行使权
说明:
1.这三个方法必须在同步代码块或者同步方法中使用(lock的话不行)
2.这是三个方法的调用者必须是同步代码块或同步方法中的同步监视器(也就是锁)。如果是this那么也是this调用可以省略。如果是obj,那必须用obj调用。否则,会出现IllegalMonitorStateException
3.基于第二点,所以这三个方法是java.lang.Object类中定义的方法
wait和sleep的区别 :
同:都使线程进入阻塞状态
异:
1.sleep是Thread中声明的,wait是Object中的
2.sleep任何场景可用,wait要在synchronized下用
3.sleep和yield(进入就绪)都不会释放锁,wait自动释放锁
4.sleep到时间自己醒,wait要搭配notify、notifyAll唤醒