题解 | #多线程#

多线程

http://www.nowcoder.com/practice/cd99fbc6154d4074b4da0e74224a1582

#真线程
#定义四个线程锁,输出"A"后,释放B的锁,从而达到通知B
import threading
import sys

#线程函数1控制次数,输出"A"后,释放B的锁...
def ThreadFun1(num):
    global stop
    for i in range(num):
        lock1.acquire()
        res.append("A")
        if i == num - 1:#输出完最后一次,就通知其他线程输完一次就可以结束了
            stop = True
        lock2.release()#释放B的锁,从而达到通知B

def ThreadFun2():
    global stop
    while True:
        lock2.acquire()
        res.append("B")
        lock3.release()
        if stop == True:#结束线程
            return

def ThreadFun3():
    global stop
    while True:
        lock3.acquire()
        res.append("C")
        lock4.release()
        if stop == True:
            return

def ThreadFun4():
    global stop
    while True:
        lock4.acquire()
        res.append("D")
        lock1.release()#输出完"D"释放"A"的锁
        if stop == True:
            return

while True:
    try:
        N = int(input())
        res = []
        stop = False
        #定义四个线程锁
        lock1 = threading.Lock()
        lock2 = threading.Lock()
        lock3 = threading.Lock()
        lock4 = threading.Lock()
        #给其他三个线程加上锁先
        lock2.acquire()
        lock3.acquire()
        lock4.acquire()
        #定义4个线程,只有第一个有参数,用于初始化输出A次数
        t1 = threading.Thread(target=ThreadFun1, args=(N,))
        t2 = threading.Thread(target=ThreadFun2, args=())
        t3 = threading.Thread(target=ThreadFun3, args=())
        t4 = threading.Thread(target=ThreadFun4, args=())
        #开启线程
        t1.start()
        t2.start()
        t3.start()
        t4.start()
        #等待线程结束
        t1.join()
        t2.join()
        t3.join()
        t4.join()
        #线程都结束后,输出结果
        print("".join(res))
    except:
#         print(sys.exc_info())
        break



# import sys
# import threading
# while True:
#     try:
#         N = int(input())
#         threadLock = threading.Lock()
#         index = 1
#         res = []
#         class AddAlpha(threading.Thread):
#             def __init__(self, N, threadId):
#                 threading.Thread.__init__(self)
# #                 super(AddAlpha,self).__init__()
# #                 super.__init__(self)
#                 self.n = N
#                 self.threadId = threadId
#                 self.count = 0
#             def run(self):
#                 global index
#                 while self.count < self.n:
#                     threadLock.acquire()
#                     if index == 1 and self.threadId == 1:
#                         res.append("A")
#                         self.count += 1
#                         index = 2
#                     if index == 2 and self.threadId == 2:
#                         res.append("B")
#                         self.count += 1
#                         index = 3
#                     if index == 3 and self.threadId == 3:
#                         res.append("C")
#                         self.count += 1
#                         index = 4
#                     if index == 4 and self.threadId == 4:
#                         res.append("D")
#                         self.count += 1
#                         index = 1
#                     threadLock.release()

#         threads = []
#         threads.append(AddAlpha(N,1))
#         threads.append(AddAlpha(N,2))
#         threads.append(AddAlpha(N,3))
#         threads.append(AddAlpha(N,4))

#         for thread in threads:
#             thread.start()

#         for thread in threads:
#             thread.join()

#         print("".join(res))
#     except:
# #         print(sys.exc_info())
#         break

















全部评论

相关推荐

牛客717484937号:双飞硕没实习挺要命的
点赞 评论 收藏
分享
dongsheng66:如果想进大厂的话,在校经历没必要占这么大篇幅,可以把专业技能单独放一个专栏写,可以加个项目经历
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务