#coding=utf-8
|
|
import threading
|
|
import random
|
|
import time
|
|
|
|
class SemaphoreThread(threading.Thread):
|
|
"""classusing semaphore"""
|
|
|
|
availableTables=['A','B','C','D','E']
|
|
|
|
def __init__(self,threadName,semaphore):
|
|
"""initialize thread"""
|
|
|
|
threading.Thread.__init__(self,name=threadName)
|
|
self.sleepTime=random.randrange(1,6)
|
|
#set the semaphore as a data attribute of the class
|
|
self.threadSemaphore=semaphore
|
|
def run(self):
|
|
"""Print message and release semaphore"""
|
|
|
|
#acquire the semaphore
|
|
self.threadSemaphore.acquire()
|
|
#remove a table from the list
|
|
table=SemaphoreThread.availableTables.pop()
|
|
print "%s entered;seated at table %s." %(self.getName(),table),
|
|
print SemaphoreThread.availableTables
|
|
time.sleep(self.sleepTime)
|
|
#free a table
|
|
print " %s exiting;freeing table %s." %(self.getName(),table),
|
|
SemaphoreThread.availableTables.append(table)
|
|
print SemaphoreThread.availableTables
|
|
#release the semaphore after execution finishes
|
|
self.threadSemaphore.release()
|
|
|
|
threads=[] #list of threads
|
|
#semaphore allows five threads to enter critical section
|
|
threadSemaphore=threading.Semaphore(len(SemaphoreThread.availableTables))
|
|
#创建一个threading.Semaphore对象,他最多允许5个线程访问临界区。
|
|
#Semaphore类的一个对象用计数器跟踪获取和释放信号机的线程数量。
|
|
#create ten threads
|
|
for i in range(1,11):
|
|
threads.append(SemaphoreThread("thread"+str(i),threadSemaphore))
|
|
#创建一个列表,该列表由SemaphoreThread对象构成,start方法开始列表中的每个线程
|
|
#start each thread
|
|
for thread in threads:
|
|
thread.start()
|