Главные причины не использовать STL состоят в том что:
Оба - очень редкие требования на практике.
Для долгосрочного проекта, прокручивающего Ваши собственные контейнеры, которые накладываются в функциональности с STL, просто собирается увеличить затраты на обслуживание и затраты на разработку.
Просто join ()
все потоки перед вызовом doLogging ()
:
t1.join();
t2.join();
// the following line will be executed when both threads are done
doLogging();
Обратите внимание, что порядок join ()
не имеет значения, если вы хотите дождаться всех ваших потоков.
В дополнение к решению 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()
Если вы запускаете код из основного потока, имейте в виду, что это приведет к зависанию пользовательского интерфейса до завершения обоих потоков. Это может быть нежелательным эффектом.
Вместо этого вы можете рассмотреть конструкцию, в которой каждый поток синхронизируется с вашим объектом Logger
, и выполнять его вызовы внутри этой конструкции. Поскольку я не знаю, что вы конкретно пытаетесь выполнить, другое решение - это то, что предложил Иоахим , только поместив этот код в поток.