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()
    


    输出结果如下:

  • 相关阅读:
    Delphi 与 C/C++ 数据类型对照表
    JAVA中堆和栈的区别
    关于Column '*' not found 解决方案 Hibernate使用SQL查询返回实体类型,即返回某个类,或实体类
    Oracle笔记
    oracle时间运算
    struts2中iterator标签的相关使用
    url传中文,转码
    表格的css,细线表格
    使用struts 2 获取服务器数据 ongl表达式 标签
    struts 2 Commons FileUpload文件上传
  • 原文地址:https://www.cnblogs.com/fuhaots2009/p/3476550.html
Copyright © 2011-2022 走看看