我可能在這裏問一個設計模式問題。如何處理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倍 - 一旦失敗,再嘗試睡一個隨機的時間量。因此,失敗的線程不會同時喚醒並再次失敗。
- 如果服務器拋出某種獨特的消息,例如服務器繁忙,則重新嘗試無限(?)(大量)次。
我還沒有實現上述可能的解決方案。我想首先了解這個通用/最佳解決方案,並花時間實施它。
任何想法?