java - 为什么这些 Callables 永远不会完成?

标签 java multithreading executorservice callable

我有一个代码片段,其中一个循环提交 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 语句永远不会变为真。我检查了调用方法是否结束。它每次都这样做。 detailURL 列表也充满了想要的 URL。但只有 isDone() 始终为假。

有人可以告诉我我做错了什么吗?

最佳答案

因为当您迭代列表时,还没有任何 Callables 完成。

如果您想阻塞直到 Callable 完成,您可以调用 controllList.get(k).get() - 这将阻塞直到任务完成。

对于您的用例,您还可以查看 ExecutorCompletionService executor .

关于java - 为什么这些 Callables 永远不会完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24002015/

相关文章:

java - Java中的Columnar Transposition解密算法

Java - 为什么不允许将数组常量作为 Annotation 属性值?

java - 两个并排的 JFrame

Java 并发 : How can I tell which Future belongs to which Callable during processing?

java - 超过 2 个线程的工作速度比 1 或 2 个线程慢,除非将 Thread.sleep(1) 放入线程的 run() 方法中

java - jackson 对象映射器 : Issues with date serialization and deserialization

java - Java 函数执行的时间限制

java - 如何安全地清理并发映射

尝试使用 ReetrantLock(true) 锁定/解锁时 Java 线程锁

java - newCachedThreadPool如何复用线程?