我使用了CopyOnWriteArrayList集合对象,该对象包含1000个URL。每个URL都表示一个文件。
我想使用多线程池化机制来并行下载这些URL文件。
尝试使用以下代码:
CopyOnWriteArrayList<String> fileList = DataExtractor.getRefLinks();
ExecutorService threadPool = Executors.newFixedThreadPool(4);
CompletionService<String> pool = new ExecutorCompletionService<String>(
threadPool);
for (int i = 0; i < fileList.size() ; i++){
pool.submit(new StringTask(fileList));
}
这次点击同一个网址4次。可能做错了什么。你能告诉我哪里出错吗?
我的要求是一次挑选4个网址(线程)并开始并行下载,直到列表中的所有网址完成下载。
感谢。
答案 0 :(得分:4)
我不知道StringTask
是什么,但您似乎正在将完整的网址列表传递给它。进行适当的更改,只从列表中提交一个网址
pool.submit(new StringTask(fileList.get(i)));
(或者使用fileList
上的迭代器,以CopyOnWriteArrayList
为准。
for (String url : fileList){
pool.submit(new StringTask(url));
}