zoukankan      html  css  js  c++  java
  • 多线程经典问题-----乘客做公交车问题解答3

    问题描述:

    乘客乘坐公交车问题,司机,乘客,售票员协同工作,通过多线程模拟三者的工作。
    司机:开车,停车
    售票员:打开车门,关闭车门
    乘客:上车,下车

    用Python的Event做线程同步通信,代码如下:

    # *-* coding:gb2312 *-*
    import threading
    import time
    
    stationName=("车站0","车站1","车站2","车站3","车站4","车站5","车站6")
    currentStationIndex = -1
    eventBusStop = threading.Event()
    eventClosedDoor = threading.Event()
    eventOpenedDoor = threading.Event()
    stationCount = len(stationName)
    
    class Passenger(threading.Thread):
    	def __init__(self,no,getonStation,getoffStation):
    		self.no =no
    		self.getonStation=getonStation
    		self.getoffStation=getoffStation
    		threading.Thread.__init__(self)
    	
    	def run(self):
    		bExit= False
    		global currentStationIndex
    		global stationCount
    		bAlreadyGetOnStation = False
    		while not bExit:
    			eventOpenedDoor.wait()
    			if self.getonStation == currentStationIndex and bAlreadyGetOnStation == False: 
    				print "乘客%d在%s上车" %(self.no,stationName[currentStationIndex])
    				bAlreadyGetOnStation =True
    			elif self.getoffStation == currentStationIndex:
    				print "乘客%d在%s下车" %(self.no,stationName[currentStationIndex])
    				bExit = True
    			time.sleep(1)
    					
    	
    		
    class Driver(threading.Thread):
    	def run(self):
    		bExit= False
    		global currentStationIndex
    		global stationCount
    		while not bExit:
    			print "司机: 公交车开始行驶....."
    			time.sleep(5)
    			currentStationIndex += 1
    			print "司机: 到站 ",stationName[currentStationIndex]
    			eventBusStop.set()
    			eventClosedDoor.wait()
    			eventClosedDoor.clear()
    			if currentStationIndex == stationCount-1:
    				bExit= True
    			
    class Conductor(threading.Thread):
    	def run(self):
    		bExit= False
    		global currentStationIndex
    		global stationCount
    		while not bExit:
    			eventBusStop.wait()
    			eventBusStop.clear()
    			print "售票员打开车门:%s到了" %(stationName[currentStationIndex])
    			eventOpenedDoor.set()
    			time.sleep(5)
    			print "售票员关闭车门"
    			eventOpenedDoor.clear()
    			eventClosedDoor.set()
    			if currentStationIndex == stationCount-1:
    				bExit = True
    
    	
    def test():
    	passPool=[]
    	
    	passPool.append(Passenger(0,0,3))
    	passPool.append(Passenger(1,1,3))
    	passPool.append(Passenger(2,2,4))
    	passPool.append(Passenger(3,0,5))
    	passPool.append(Passenger(4,1,3))
    	passPool.append(Passenger(5,2,4))
    	passPool.append(Passenger(6,4,5))
    	passPool.append(Passenger(7,0,2))
    	passPool.append(Passenger(8,1,3))
    
    	passPool.append(Conductor())
    	passPool.append(Driver())
    	leng = len(passPool)
    	for i in range(leng):
    		passPool[i].start()
    	
    if __name__=='__main__':
    	test()
    


    输出结果如下:

  • 相关阅读:
    【华为云技术分享】浅谈服务化和微服务化(上)
    STM32 GPIO的原理、特性、选型和配置
    【华为云技术分享】如何设计高质量软件-领域驱动设计DDD(Domain-Driven Design)学习心得
    【华为云技术分享】如何做一个优秀软件-可扩展的架构,良好的编码,可信的过程
    【华为云技术分享】华为云MySQL新增MDL锁视图特性,快速定位元数据锁问题
    如何使网站支持https
    如何说孩子才会听,怎么听孩子才肯说
    box-sizing布局学习笔记
    vertical-align属性笔记
    Github上整理的日常发现的好资源【转】
  • 原文地址:https://www.cnblogs.com/fuhaots2009/p/3476550.html
Copyright © 2011-2022 走看看