我可能在这里问一个设计模式问题。如何处理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倍 - 一旦失败,再尝试睡一个随机的时间量。因此,失败的线程不会同时唤醒并再次失败。
- 如果服务器抛出某种独特的消息,例如服务器繁忙,则重新尝试无限(?)(大量)次。
我还没有实现上述可能的解决方案。我想首先了解这个通用/最佳解决方案,并花时间实施它。
任何想法?