Я использую несколько потоков для загрузки файлов на сервер. Апплет Java отвечает за отображение пользовательского интерфейса. Сначала я запускаю 5 потоков с помощью ThreadPoolExecutor и назначаю им 5 файлов. После каждой загрузки я получаю уведомление с сервера. Когда поток завершает выполнение, другой новый поток назначается с файлом, пока все файлы не будут загружены на сервер.
Основная структура кода выглядит следующим образом:
i> метод startUpload () вызывается из Java-апплета, который отвечает за обработку функций загрузки.
class Upload extends Runnable{
...............................
..............................
public void startUpload() {
............................... //other initialisations done
int waitTime = 500;
Random random = new Random();
ExecutorService executor = new ThreadPoolExecutor(5, 5, 50000L, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(300));
while (it.hasNext()) {
int time = random.nextInt(1000);
waitTime += time;
newFile = new File((String) it.next());
executor.execute(new Runnable() {
@Override
public void run() {
try{
Thread.sleep(wait);
}
catch(Exception e){
}
processFile1(newFile);
}
});
}
try {
Thread.sleep(waitTime);
executor.shutdown();
executor.awaitTermination(waitTime, TimeUnit.MILLISECONDS);
} catch (Exception e) {
}
}
}
Проблема, с которой я сейчас сталкиваюсь.
i> Пользовательский интерфейс обновляется только в конце загрузки всех файлов. На промежуточном этапе пользовательский интерфейс находится в подвешенном состоянии. Похоже, EDT переходит в заблокированное состояние.
Тот же код для рендеринга пользовательского интерфейса работал нормально, когда я использовал класс Thread, notify / sleep для реализации той же функциональности. Я изменил код на ThreadPoolExecutor, поскольку в одном из блогов / статей я не увидел, что это лучший способ реализации многопоточности из Java версии 5.0.
ii> Еще одна вещь, которую я заметил с ThreadPoolExecutor, когда я загружаю несколько файлов размером 1 КБ (для целей тестирования), если я удаляю все wait () из приведенного выше кода, следующая строка назначает новый файл, но один и тот же файл всегда загружается несколькими потоками.
newFile = новый файл ((строка) it.next ());
Но при добавлении sleep () с помощью run () несколько потоков загружают на сервер разные файлы.
Есть ли проблемы с реализацией вышеуказанного кода?