mitaichik
@mitaichik

Как работают потоки в Java?

Господа, помогите ламмеру разобраться в потоках!

Задача: в цикле создается n потоков и запускаются. После цикла нужно подождать пока они все выполнятся.
У меня получился вот такой код:

List<Thread> threads = new ArrayList<>();

        for(int i = 0; i < 10; i++){
            Thread thread = new Thread(new Calculate());
            thread.start();
            threads.add(thread);
        }

        for(Thread thread : threads){
            thread.join();
        }


Правильно ли он написан? Смущает фраза из книги по Java что-то типа "Join присоединяет поток к родительскому потоку, и родительский поток не будет завершен до тех пор пока не будут завершено все приджойненные потоки"

С одной стороны вроде join ожидает завершение потока, с другой стороны, судя по словам из книги, он не ждет завершения потока, и идет дальше, всего лишь заставляя главный поток не завершаться до тех пор пока не выполнены приджойненные потоки.

Подскажите, как это работает на самом деле?
  • Вопрос задан
  • 611 просмотров
Решения вопроса 1
zagayevskiy
@zagayevskiy Куратор тега Java
Android developer at Yandex
join() блокирует родительский поток до тех пор, пока не завершится поток для которого вызван join(). Собственно, именно потому, что после вызова join() родитель не идёт дальше, он и не завершится раньше.
Для иллюстрации попробуйте в вашем Calculate вставить бесконечный цикл, а после thread.join(); - System. out.println("joined");

На тему кода - всё ок, кроме того, что не учтён InterruptedException, который может выбросить join
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы