Это совершенно нормально. Вы не дожидаетесь завершения потоков, поэтому у вашего кода нет причин блокировать после цикла for
.
Вам понадобится второй цикл, в котором вы будете вызывать .join()
в каждом потоке, если вы хотите их ждать.
Тем не менее, «конец сценария» печатается сразу после того, как я выполню первый поток, а не после того, как все потоки закончили
Это только впечатление, которое вы получаете. Запустите этот код несколько сотен раз, и вы сможете увидеть «конец сценария» перед тем, как какой-либо поток будет выводиться вообще, или после того, как два или три потока будут зарегистрированы.
Этот «конец сценария» печатается после запуска всех потоков.
Как только вы запускаете поток, он конкурирует с другими (включая ваш основной поток) за ресурсы, такие как процессор. Какой поток запускается, определяется операционной системой и (как правило) не находится под вашим контролем, а также не предсказуемо.
Итак, в выводе, который вы опубликовали, первый поток получил немного ресурсов процессора, в то время как основной поток все еще был занят запуском других. Это просто «совпадение».