# -*- coding:UTF-8 -*-

import thread
import time

#为线程定义一个函数
def print_time(threadName,delay):
	count = 0
	while count < 5:
		time.sleep(delay)
		count += 1
		print "%s: %s" % (threadName,time.ctime(time.time()))



#创建两个线程
'''
try:
	thread.start_new_thread(print_time,("Thread-1",2,))
	thread.start_new_thread(print_time,("Thread-2",4,))
except:
	print "Error:unable to start thread"

while 1:
	#这里需要加空函数的原因：
	#如果没有循环的空函数，程序运行到这里就结束了。
	pass

print "run finish"
'''

## 使用Threading模块创建线程
'''
import threading
import time

exitFlag = 0

class myThread(threading.Thread):  #继承父类treading.Thread
	def __init__(self,threadID,name,counter):
		threading.Thread.__init__(self)
		self.threadID = threadID
		self.name = name
		self.counter = counter
	def run(self):
		print "Starting " + self.name
		print_time_ex(self.name,self.counter,5)
		print "Exiting " + self.name

def print_time_ex(threadName,delay,counter):
	while counter:
		if exitFlag:
			(threading.Tread).exit()
		time.sleep(delay)
		print "%s: %s" % (threadName,time.ctime(time.time()))
		counter -= 1

#创建新线程
thread1 = myThread(1,"Thread-1",1)
therad2 = myThread(2,"Thread-2",2)

#开启线程
thread1.start()
therad2.start()

print "Exiting Main Thread"
'''


## 线程同步
'''
import threading
import time

exitFlag = 0

class myThread(threading.Thread):
	def __init__(self,threadID,name,counter):
		threading.Thread.__init__(self)
		self.threadID = threadID
		self.name = name
		self.counter = counter

	def run(self):
		print "Starting " + self.name
		#获得锁
		threadLock.acquire()
		print_time(self.name,self.counter,3)
		#释放锁
		threadLock.release()

def print_time(threadName, delay, counter):
    while counter:
        if exitFlag:
            (threading.Thread).exit()
        time.sleep(delay)
        print "%s: %s" % (threadName, time.ctime(time.time()))
        counter -= 1


threadLock = threading.Lock()
threads = []

#创建新线程
thread1 = myThread(1,"Thread-1",1)
thread2 = myThread(2,"Thread-2",2)

#开启线程
thread1.start()
thread2.start()

#添加线程到线程列表
threads.append(thread1)
threads.append(thread2)

#等待所有线程完成
for t in threads:
	t.join()
	pass

print "Exiting Main Thread"
'''


## 线程优先级队列
import Queue
import threading
import time

exitFlag = 0

class myThread(threading.Thread):
	def __init__(self,threaID,name,q):
		threading.Thread.__init__(self)
		self.threadID = threadID
		self.name = name
		self.q = q

	def run(self):
		print "Starting " + self.name
		process_data(self.name,self.q)
		print "Exiting " + self.name

def process_data(threadName,q):
	while not exitFlag:
		queueLock.acquire()
		if not workQueue.empty():
			data = q.get()
			queueLock.release()
			print "%s processing %s" % (threadName,data)
		else:
			queueLock.release()
		time.sleep(1)

threadList = ["Thread-1","Thread-2","Thread-3",]
nameList = ["One", "Two", "Three", "Four", "Five"]
queueLock = threading.Lock()
workQueue = Queue.Queue(10)
threads = []
threadID = 1

#创建新线程
for tName in threadList:
	thread = myThread(threadID,tName,workQueue)
	thread.start()
	threads.append(thread)
	threadID += 1

#填充队列
queueLock.acquire()
for work in nameList:
	workQueue.put(work)
queueLock.release()

#等待队列清空
while not workQueue.empty():
	pass

#通知所有线程--》退出
exitFlag = 1

#等待所有线程完成
for t in threads:
	t.join()

print "Exiting Main Thread"






















