线程启动的先后问题

来源:11-5 线程同步 - condition 使用以及源码分析

ImClever

2023-04-07

import threading


class XiaoAI(threading.Thread):
    def __init__(self, lock):
        super().__init__(name="小爱同学")
        self.lock = lock

    def run(self):
        for msg in ["在", "我住长江尾", "处处闻啼鸟", "烟火人间轻声言"]:
            
            # self.lock.acquire()
            with self.lock:
                self.lock.wait()
                print("{}:{}".format(self.name, msg))
                self.lock.notify()


class TianMao(threading.Thread):
    def __init__(self, lock):
        super().__init__(name="天猫精灵")
        self.lock = lock

    def run(self):
        for msg in ["小爱同学", "君住长江头", "春眠不觉晓", "青衣白马徐凤年"]:
            # self.lock.acquire()
            with self.lock:
                print("{}:{}".format(self.name, msg))
                self.lock.notify()
                self.lock.wait()
            


if __name__ == "__main__":
    # lock = threading.Lock()
    lock = threading.Condition()
    xiaoai = XiaoAI(lock)
    tianmao = TianMao(lock)

    tianmao.start()
    xiaoai.start()

上述代码里面,我将 线程tianmao 先start, 线程xiaoai 后start。导致输出的结果:

天猫精灵: 小爱同学

如果调换两个线程的执行顺序,那么就能完美实现对话内容。

那么我是不是可以得出一个结论:

先执行wait()的线程需要在主线程内,先start。

写回答

1回答

bobby

2023-04-07

//img.mukewang.com/szimg/642fef09099a829308770684.jpg 注意这两个线程的代码是不一样的,调用函数顺序也不一样

0
2
bobby
回复
ImClever
好的。。。
2023-04-09
共2条回复

Python3高级核心技术97讲,高级进阶的必学课程

socket编程/多线程/多进程/线程池/asyncio并发编程/协程和异步IO

2121 学习 · 551 问题

查看课程