Запрос на выполнение потока

#java #multithreading #thread-safety

#java #многопоточность #безопасность потоков

Вопрос:

Я запустил четыре потока (многопоточность) и назначил задачу для каждого из потоков. Задачей для каждого потока является загрузка файла на сервер

Я хочу выполнить следующие функции.

i> Я хочу назначить следующий набор файлов 4 новым потокам только тогда, когда все существующие 4 потока завершат свое выполнение.

Как я могу определить, завершили ли все существующие 4 потока их выполнение?

Я использовал условие

 for (Thread thread : threads) {

    if(thread.getState() == Thread.State.TERMINATED || getAlive()) == false){

        counter ;

    }
}
  

чтобы узнать состояние потоков .

Если значение счетчика становится 4 , то это означает, что все потоки не являются активными или завершены.

Я получаю уведомление для каждого загружаемого файла.

После того, как я обнаружил, что значение счетчика = 4, я снова назначил четыре новых файла для загрузки с использованием четырех новых потоков.

Может возникнуть ситуация, когда файл не был загружен в первый раз, поэтому мне нужно переназначить его снова . Я обнаружил, что переназначаю файл, который уже загружен. Итак, это дублирующая загрузка. Я снова назначил файл, поскольку не получил уведомления об успешной загрузке для этого конкретного файла.

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

Поскольку я использовал четыре потока, counter = 4 означает, что все потоки выполнили свою операцию.

Каким должен быть мой подход к решению проблемы?

Комментарии:

1. используется join() для блокировки вызывающего потока до завершения потока.

Ответ №1:

Посмотрите на CountDownLatch .

Ответ №2:

обязательно ли загружать файлы в наборе из 4

Future может использоваться для блокировки до завершения операции http://download.oracle.com/javase/6/docs/api/java/util/concurrent/Future.html

Ответ №3:

Вот хороший вариант.. ожидание завершения потоков

http://javahowto.blogspot.com/2007/05/when-to-join-threads.html