#!/usr/bin/env python3 #coding=utf-8 import threading import time import ThreadTime 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("开始线程:"+self.name) print_time(self.name,self.counter,5) print("退出线程:"+self.name) def print_time(threadName,delay,counter): while counter: if exitFlag: threadName.exit() time.sleep(delay) print("%s:%s"%(threadName,time.ctime(time.time()))) counter-=1 #创建连个线程 try: #创建新线程 thread1=myThread(1,"Thread-1",1) thread2=myThread(2,"Thread-2",2) #开启新线程 thread1.start() thread2.start() thread1.join() thread2.join() print("退出主线程") except: print("Error:无法启动线程")
#线程同步
#!/usr/bin/env python3 #coding=utf-8 import threading import time 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("开启线程:"+self.name) #获取锁,用于线程同步 threadLock.acquire() print_time(self.name,self.counter,6) #释放锁,开启下一个线程 threadLock.release() def print_time(threadName,delay,counter): while counter: 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() print("退出线程"+t.name) print("退出主线程")
#!/usr/bin/env python3 #coding=utf-8
#队列 安全
import queue import threading import time exitFlag = 0 class myThread (threading.Thread): def __init__(self, threadID, name, q): threading.Thread.__init__(self) self.threadID = threadID self.name = name self.q = q def run(self): print ("开启线程:" + self.name) process_data(self.name, self.q) print ("退出线程:" + 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 word in nameList: workQueue.put(word) queueLock.release() # 等待队列清空 while not workQueue.empty(): pass # 通知线程是时候退出 exitFlag = 1 # 等待所有线程完成 for t in threads: t.join() print ("退出主线程")
运行结果:
开启线程:Thread-2
开启线程:Thread-3
Thread-1 processing One
Thread-3 processing Two
Thread-2 processing Three
Thread-1 processing Four
Thread-3 processing Five
退出线程:Thread-2
退出线程:Thread-1
退出线程:Thread-3
退出主线程