You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Threading.join()调用顺序与执行行为疑问及代码异常分析

Python threading.join() 相关问题解答

1. join()调用顺序与线程执行顺序的关系

join() 不能保证线程的执行顺序,它的核心作用是让调用join()的线程(通常是主线程)等待目标线程执行完毕后,再继续执行后续代码。线程的实际执行顺序由操作系统的调度器决定,start()的调用顺序仅代表线程启动顺序,不代表执行顺序。

2. 关于join()是否可视为“钩子”

可以这么理解,但要明确:join()不是用来告知线程何时结束,它只是阻塞当前线程(比如主线程),直到目标线程运行终止。一旦目标线程结束,join()下方的代码会立刻执行,这部分逻辑确实可以看作目标线程结束后的“钩子”。

3. 代码输出不符合预期的原因分析

你的代码中join的调用顺序决定了主线程的阻塞流程:

thread3.join()
print("debajo del thread3")
thread1.join()
print("debajo del thread1")
thread2.join()
print("debajo del thread2")

主线程的执行逻辑是:

  • 先等待thread3结束,打印debajo del thread3
  • 紧接着进入thread1的join阻塞状态——此时不管thread2是否已经结束,主线程都必须等thread1执行完毕,才能继续执行print("debajo del thread1")
  • 只有等thread1结束、打印完debajo del thread1后,主线程才会执行thread2.join()(此时thread2早已结束),随后打印debajo del thread2

这就是debajo del thread2要等thread1结束才出现的原因:主线程的执行路径被thread1的join阻塞,根本没机会提前处理thread2的join和后续打印。

如果要实现你预期的输出,只需调整join的顺序:

thread3.join()
print("debajo del thread3")
# 先等待thread2结束并打印对应语句
thread2.join()
print("debajo del thread2")
# 最后等待thread1结束并打印
thread1.join()
print("debajo del thread1")

这样主线程会按thread3→thread2→thread1的顺序等待,就能得到你想要的输出结果。

内容的提问来源于stack exchange,提问作者user19551894

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 15:25:14