Мне недавно пришлось реализовать контроллер, который передает файлы с A на B. Существует около 8000 файлов с размером по 1-2 мб каждый.Реализация динамического контроллера передачи файлов с использованием ThreadPoolExecutor в Java
- Если передача файла прошла успешно, создайте еще один поток. (в настоящее время увеличивать значение corePooleSize +1)
- Если сбой одного файла невозможен, закройте одну попытку переноса потока. (в настоящее время увеличивайте corePooleSize -1)
- Если сбой одного файла невозможен, не создавайте другой поток в течение определенного времени.
Идея заключается в том, чтобы получить максимально возможное количество соединений/лучшую скорость передачи, не зная ограничений хоста.
Теперь, мой вопрос, является ли ThreadPoolExecutor лучшим способом реализовать это поведение или есть лучший способ?
//Code simplified
//add all files to callables with type Future<Boolean>
while (true) {
// entry = get the first result that's done.
if (entry.getValue().get() == Boolean.TRUE) {
results.remove(entry.getKey());
if (results.size() > threadPool.getCorePoolSize()) {
if (System.currentTimeMillis() >= nextAttempt)
resizeThreadPool(+1);
}
} else {
resizeThreadPool(-1);
nextAttempt = System.currentTimeMillis() + someTimeinMs;
entry.setValue(threadPool.submit(entry.getKey()));
}
if (results.isEmpty())
return true;
}
Изменить: Существует минимальный & максимальное количество потоков данных в качестве параметра.
Вам нужно полностью переосмыслить это. В ваших вычислениях нет ничего общего с «лучшей скоростью передачи», так что вы в конечном итоге создадите огромное количество потоков, все избивая и конкурируя друг с другом за процессор и сеть и не получая абсолютно никуда. Максимальное количество потоков, которое вы должны использовать, - это пропускная способность канала, деленная на целевую скорость передачи. Вы найдете это число довольно маленьким. – EJP