Здесь можно задать вопрос о шаблоне дизайна.Как обращаться с ThreadPool, попадающим на ограничение соединения с сервером
На Android я использую пул потоков, чтобы открыть 8 потоков для загрузки некоторых файлов.
try {
ExecutorService pool = Executors.newFixedThreadPool(8);
for (int i = 0; i < someList.size(); i++) {
pool.submit(new DownloadJsonTask(someList.get(i), context));
}
pool.shutdown();
pool.awaitTermination(Long.MAX_VALUE, TimeUnit.MILLISECONDS);
} catch (Exception e) {
}
Я заметил, если я использую одну нить, чтобы загрузить один за другим, то я вряд ли получите сбой загрузки, но если я использую 8 потоков, то я иногда получаю сбой загрузки. Я не являюсь пользователем сервера/сети, поэтому я не знаю подробно, но я предполагаю, что сервер устанавливает ограничение на одно устройство (или один IP-адрес), пытающееся подключить несколько подключений.
Если это причина, то как мне создать код для решения этой проблемы? Я уже выполнил попытку загрузки 3 раза перед сбоем. Кажется, он исправил это «на данный момент». Тем не менее, я знаю, что мой код не является надежным, и он может сбой в какой-то момент.
Я подумал, что я не был бы первым, кто столкнулся с этой проблемой. Я хотел бы знать надежное решение этой проблемы.
решения я мог думать:
- Попробуйте загрузить по крайней мере 3 раза перед отказом
- После того, как не удалось, то попробуйте спать в течение случайного промежутка времени. Так что неудачные нити не просыпаются одновременно и снова сбой.
- Если сервер выдает какое-то уникальное сообщение назад, такое как занятый сервер, повторите попытку неограниченного (?) (Большого количества) раз.
Я еще не реализовал выше возможных решений. Сначала я хочу знать общее/лучшее решение и тратить время на его реализацию.
Любые идеи?