import threading,time
zhenglong=[] #共享数据的蒸笼
#创建两把锁 一把蒸馒头的锁 由伙夫掌管
#另外一把吃馒头的锁 由吃货掌管
zheng_lock=threading.Lock()
zheng_Cond=threading.Condition(lock=zheng_lock)
chi_lock=threading.Lock()
chi_Cond=threading.Condition(lock=chi_lock)
class huofu(threading.Thread):
def __init__(self,name):
threading.Thread.__init__(self)
self.setName(name)
def run(self):
while True:
chi_Cond.acquire()#被唤醒
if len(zhenglong)==0:
#开始正包子
for i in range(1,11):
zhenglong.append(i)
time.sleep(0.1)
print('正在蒸第{0}个包子'.format(i))
print('包子蒸完了 唤醒吃货们开始吃包子...')
chi_Cond.notify_all()
chi_Cond.release()#唤醒了伙夫 他就释放
#伙夫进入休眠
zheng_Cond.acquire()
zheng_Cond.wait()
zheng_Cond.release()
class chihuo(threading.Thread):
def __init__(self,name):
threading.Thread.__init__(self)
self.setName(name)
def run(self):
while True:
chi_Cond.acquire()#同一个时刻只有一个吃货在获取吃包子的资源
global zhenglong
if len(zhenglong)==0:
#开始呼唤伙夫 只叫一次 蒸包子 吃货们开始休眠
zheng_Cond.acquire()#锁定叫醒伙夫的线程
zheng_Cond.notify()#唤醒
zheng_Cond.release()#释放
chi_Cond.wait()#吃货休眠
else:
baozi=zhenglong.pop()
print('{0}吃了第{1}个包子 剩余{2}个包子'.format(self.getName(),baozi,len(zhenglong)))
time.sleep(0.1)
chi_Cond.release()
W=huofu('伙夫')
xiaogang=chihuo('小刚')
xiaoming=chihuo('小明')
xiaohong=chihuo('小红')
W.start()
xiaogang.start()
xiaoming.start()
xiaohong.start()
结果为
正在蒸第1个包子
正在蒸第2个包子
正在蒸第3个包子
正在蒸第4个包子
正在蒸第5个包子
正在蒸第6个包子
正在蒸第7个包子
正在蒸第8个包子
正在蒸第9个包子
正在蒸第10个包子
包子蒸完了 唤醒吃货们开始吃包子...
小刚吃了第10个包子 剩余9个包子
小明吃了第9个包子 剩余8个包子
小明吃了第8个包子 剩余7个包子
小明吃了第7个包子 剩余6个包子
小明吃了第6个包子 剩余5个包子
小刚吃了第5个包子 剩余4个包子
小刚吃了第4个包子 剩余3个包子
小刚吃了第3个包子 剩余2个包子
小刚吃了第2个包子 剩余1个包子
小刚吃了第1个包子 剩余0个包子
正在蒸第1个包子
正在蒸第2个包子
正在蒸第3个包子
正在蒸第4个包子
正在蒸第5个包子
正在蒸第6个包子
正在蒸第7个包子
正在蒸第8个包子
正在蒸第9个包子
正在蒸第10个包子
包子蒸完了 唤醒吃货们开始吃包子...
小红吃了第10个包子 剩余9个包子
小刚吃了第9个包子 剩余8个包子
小明吃了第8个包子 剩余7个包子
小明吃了第7个包子 剩余6个包子
小明吃了第6个包子 剩余5个包子
小明吃了第5个包子 剩余4个包子
小明吃了第4个包子 剩余3个包子
小刚吃了第3个包子 剩余2个包子
小刚吃了第2个包子 剩余1个包子
小刚吃了第1个包子 剩余0个包子
正在蒸第1个包子
正在蒸第2个包子
正在蒸第3个包子
正在蒸第4个包子
正在蒸第5个包子
正在蒸第6个包子
正在蒸第7个包子
正在蒸第8个包子
正在蒸第9个包子
正在蒸第10个包子
包子蒸完了 唤醒吃货们开始吃包子...