java为什么这些可调用函数永远无法完成?
我有一个代码片段,循环提交Callable,然后检查是否完成了这些操作,如果完成了,打印出它们的值
ArrayList<Future<ArrayList<String>>> controllList = new ArrayList<Future<ArrayList<String>>>();
System.out.println(""+pagecount);
for(int n=1;n<=pagecount;n++){
if(controllList.size()<10){
Future<ArrayList<String>> temp = exeService.submit(new URLSpider("localhost"));
controllList.add(temp);
}
for(int k=0;k<controllList.size();k++){
if(controllList.get(k).isDone()){
System.out.println("Something done");
ArrayList<String> URLs = controllList.get(k).get();
for(int h=0;h<URLs.size();h++){
System.out.println(URLs.get(h));
}
controllList.remove(k);
}
}
}
URLSpider类:
public class URLSpider implements Callable<ArrayList<String>> {
private TagNode node;
private String pageUrl;
private Object[] links;
private ArrayList<String> detailLinks;
public URLSpider(String completePageURL){
pageUrl = completePageURL;
detailLinks = new ArrayList<String>();
}
@Override
public ArrayList<String> call() throws Exception {
HtmlCleaner cleaner = new HtmlCleaner();
try {
node = cleaner.clean(new URL(pageUrl));
} catch (IOException e1) {
e1.printStackTrace();
}
try {
String link;
links = node.evaluateXPath("some XPath");
for(int i =0;i<links.length;i++){
link=((TagNode)links[i]).getAttributeByName("href");
System.out.println(link); //the code produces URLs as wanted
detailLinks.add(link);
}
} catch (Exception e) {
e.printStackTrace();
}
return detailLinks;
}
}
我的问题是,第二个for循环中的if语句永远不会变成true。我检查了call方法是否到达末尾。每次都是这样。此外,detailURL列表中还包含了所需的URL。但isDone()一直都是假的
有人能告诉我我做错了什么吗
# 1 楼答案
因为迭代列表时,所有可调用项都尚未完成
如果您想阻止,直到可调用完成,您可以调用
controllList.get(k).get()
——这将阻止,直到任务完成对于您的用例,您还可以查看ExecutorCompletionService executor