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


    输出结果如下:

  • 相关阅读:
    子线程导致 Windows 服务停止的情况(Topshelf 结合 Quartz.NET)
    ASP.NET Web API 2 使用 DelegatingHandler(委托处理程序)实现签名认证
    ASP.NET Web API 2 使用 AuthorizationFilter(授权过滤器)实现 Basic 认证
    聚合函数查询语句
    SQL SERVER数据库常用命令
    Easyui-datebox日期控件增加清空按钮
    用sql语句查出来字段里包含某个字符串的所有记录
    String 转化成java.sql.Date和java.sql.Time(转载)
    常见的 HTML 事件
    JavaScript 变量中给数值加引号的问题
  • 原文地址:https://www.cnblogs.com/fuhaots2009/p/3476550.html
Copyright © 2011-2022 走看看