Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么这些可调用项永远无法完成?_Java_Multithreading_Executorservice_Callable - Fatal编程技术网

Java 为什么这些可调用项永远无法完成?

Java 为什么这些可调用项永远无法完成?,java,multithreading,executorservice,callable,Java,Multithreading,Executorservice,Callable,我有一个代码片段,其中循环提交Callable,然后检查这些是否完成,如果完成,则打印它们的值 ArrayList<Future<ArrayList<String>>> controllList = new ArrayList<Future<ArrayList<String>>>(); System.out.println(""+pagecount); for(int n=1;n<=pagec

我有一个代码片段,其中循环提交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);
            }
        }
    }
ArrayList ControlList=新建ArrayList();
系统输出打印项次(“+pagecount”);

对于(int n=1;n,因为当您迭代列表时,所有可调用项都尚未完成

如果要阻止直到可调用完成,可以调用
ControlList.get(k).get()
-这将阻止直到任务完成


对于您的用例,您还可以查看。

,因为当您迭代列表时,所有可调用项都尚未完成

如果要阻止直到可调用完成,可以调用
ControlList.get(k).get()
-这将阻止直到任务完成

对于您的用例,您还可以查看。

阅读更多阅读更多(Y)这是一个非常好的提示,我会记住这一点。但实际问题是另一个。非常外部的for循环不必用完。因此,当它可以在第一个if子句中提交一个新的可调用时,数字n不应该增加,以便它继续在第二个for循环中检查是否有任何可调用的操作。因此,我必须实现一个elsen的声明——…我真丢脸!(Y)这是一个非常好的提示,我会记住这一点。但实际问题是另一个。非常外部的for循环不必用完。因此,当它可以在第一个if子句中提交一个新的可调用时,数字n不应该增加,以便它继续在第二个for循环中检查是否有任何可调用的操作。因此,我必须实现一个elsen的声明…,真丢脸!
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;
}

}