Как выполнить часть кода только после того, как все потоки сделаны

Главные причины не использовать STL состоят в том что:

  1. Ваша реализация C++ стара и имеет ужасную шаблонную поддержку.
  2. Вы не можете использовать динамическое выделение памяти.

Оба - очень редкие требования на практике.

Для долгосрочного проекта, прокручивающего Ваши собственные контейнеры, которые накладываются в функциональности с STL, просто собирается увеличить затраты на обслуживание и затраты на разработку.

7
задан God 13 May 2016 в 07:50
поделиться

3 ответа

Просто join () все потоки перед вызовом doLogging () :

t1.join();
t2.join();

// the following line will be executed when both threads are done
doLogging();

Обратите внимание, что порядок join () не имеет значения, если вы хотите дождаться всех ваших потоков.

23
ответ дан 6 December 2019 в 06:14
поделиться

В дополнение к решению join () в библиотеке java.util.concurrent есть еще что-то, называемое CountDownLatch. Это позволяет вам инициализировать его определенным числом, а затем ждать, пока оно не будет достигнуто указанное количество раз.

Простой пример:

CountDownLatch latch = new CountDownLatch(NUMBER_OF_THREADS);
for(int i=0; i<NUMBER_OF_THREADS;i++)
   new Thread(myCode).start();

latch.await();

Рабочие потоки должны явно активировать защелку, чтобы это работало:

latch.countDown()
6
ответ дан 6 December 2019 в 06:14
поделиться

Если вы запускаете код из основного потока, имейте в виду, что это приведет к зависанию пользовательского интерфейса до завершения обоих потоков. Это может быть нежелательным эффектом.

Вместо этого вы можете рассмотреть конструкцию, в которой каждый поток синхронизируется с вашим объектом Logger , и выполнять его вызовы внутри этой конструкции. Поскольку я не знаю, что вы конкретно пытаетесь выполнить, другое решение - это то, что предложил Иоахим , только поместив этот код в поток.

0
ответ дан 6 December 2019 в 06:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: