Прежде всего:
Метод join () экземпляра Thread можно использовать для «соединения» начала выполнения потока с концом выполнения другого потока
Это неправильное представление: это не имеет ничего общего с начиная с Threads.Объединение делает только это: поток , работающий будет ждать окончания другого потока.
Когда вы выполните someThread.join()
, поток, вызывающий этот метод, будет ждать, пока не завершится someThread!
Но все потоки соединены параллельно.
Да, потому что все они сделаны.
Ваши потоки делают все одно и то же, поэтому, кроме нескольких наносекунд здесь или там (которые в основном недействительны из-за того, что запись в System.out эффективно синхронизирует вещи в любом случае) им всем нужно одинаковое количествовремя.
Итак, когда вы присоединитесь к первому потоку ... два других потока будут завершены.Таким образом, первый вызов join()
заставляет «основной» поток ждать завершения первого потока, а последующие вызовы происходят «мгновенно», потому что эти потоки также завершены.
Чтобы отложить вещи, сделайте количество циклов параметром вашего MultiThreading
класса, а затем убедитесь, что вашим потокам потребуется различное количество времени.Если Thread-0 делает 10 циклов, а Thread-1 - 20, а Thread-2 - 30, вы увидите, что каждое соединение действительно ожидает завершения соответствующего потока.
Короче говоря: вы запускаете все ваши потоки сразу, поэтому они сразу же начинают работать параллельно.Последующий вызов объединения просто задерживает выполнение потока main до тех пор, пока не завершится каждый из рабочих потоков.