等待唤醒机制的代码实现。
注意:
包子铺线程和包子线程关系-->通信(互斥)
必须同时使用同步技术保证两个线程只能有一个在执行。
锁对象必须保证唯一,可以使用包子对象作为锁对象。
包子铺和吃货的类就需要把包子对象作为参数传递进来。
1. 需要在成员位置创建一个包子变量。
2. 使用带参数构造方法,为这个包子变量赋值。
线程状态概述
当线程被创建启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态。
一般来说有六种状态:
- NEW(新建):线程刚被创建,但是并未启动,还没有调用start方法
- Runnable(可运行):线程可以在java虚拟机中运行的状态,可能正在运行自己代码,也可能没有,这取决于操作系统处理器。
- Blocked(锁阻塞):当一个线程试图获取一个对象锁,而该对象锁被其他的线程持有,则该线程进入Blocked状态;当该线程持有锁时,该线程将变成Runnable状态。
- Waiting(无限等待):一个线程在等待另一个线程执行一个(唤醒)动作时,该线程进入Waiting状态。进入这个状态后是不能自动唤醒的,必须等待另一个线程调用notify或者notifyAll方法才能够唤醒。
- Time_Waiting(休眠状态):同Waiting状态,有几个方法有超时参数,调用他们将进入Timed Waiting状态。这一状态将一直保持到超时期满或者接受到唤醒通知。带有超时参数的常用方法有Thread.sleep、Object.wait。
- Termingted(死亡状态):因为run方法正常退出而死亡,或者因为没有捕获的异常终止了run方法而死亡。
Object类中wait带参方法和notifyAll方法
进入到TimeWaiting(计时等待)有两种方式
- 使用sleep(long m)方法,在毫秒值结束之后,线程睡醒进入到Runnable/Blocked状态。
- 使用wait(long m)方法,wait方法如果在毫秒值结束之后,还没有被notify唤醒,就会自动醒来,线程睡醒进入到Runnable/Blocked状态。
唤醒的方法:
- void notify():唤醒在此对象监视器(对象锁)上等待的单个线程。
- void notifyAll():唤醒在此对象监视器(对象锁)上等待的所有线程。