Я использую ThreadPoolExecutor для реализации многопоточности.
Обычно каждому потоку назначается файл, который необходимо загрузить на сервер.
После каждой успешной загрузки с сервера выдается уведомление.
Следующий код генерирует поток и присваивает ему файл.
Random random = new Random();
ExecutorService executor = new ThreadPoolExecutor(5, 5, 50000L, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(400));
int waitTime = 100;
while (it.hasNext()) {
int time = random.nextInt(1000);
waitTime += time;
newFile = new File((String) it.next());
executor.execute(new Runnable() {
@Override
public void run() {
processFile(newFile);
}
});
try {
Thread.sleep(waitTime);
} catch (Exception e) {
}
}
try {
Thread.sleep(waitTime);
executor.shutdown();
executor.awaitTermination(waitTime, TimeUnit.MILLISECONDS);
} catch (InterruptedException e) {
}
Я создал Java-апплет для рендеринга пользовательского интерфейса.
После каждого уведомления я обновляю состояние файла в окне Java-апплета, где updateUI () вызывается из processFile ().
Перед использованием ExecutorService (рекомендуется для обработки многопоточности на Java v5.0 и выше) я использовал класс Thread для создания потоков и ожидания-уведомления для функции загрузки файлов. Пользовательский интерфейс, отображающий каждое состояние обновления файла, корректно отображается при использовании класса Thread, но при использовании ExecutorService все файлы загружаются (функциональность работает), но пользовательский интерфейс зависает.
После успешной загрузки каждого файла необходимо обновить состояние загрузки файла для каждого из файлов.
Любые предложения / советы приветствуются.