Мне нравится начинать с визуализации желаемого потока, который, как я понимаю, выглядит следующим образом:
Это означает, что t1 и t2 должны начать одновременно, а затем вам нужно присоединиться к обоим:
t1.start() # <- Started
t2.start() # <- Started
# t1 and t2 executing concurrently
t1.join()
t2.join()
# wait for both to finish
t3.start()
t3.join()
Порядок соединения t1, t2 не очень важен, так как ваша программа все равно должна ожидать самого длинного потока. Если t1 заканчивается первым, он блокируется в t2, если t2 заканчивается первым, ему все еще нужно ждать t1, а затем произойдет «no-op» в t2.join ().