Java ExecutorService只运行2个线程,而不是4个线程

Java ExecutorService只运行2个线程,而不是4个线程,java,multithreading,Java,Multithreading,我正在开发一个从不同URL检索文件的应用程序 有一个树集包含要下载的目标。这在一个循环中处理,每个项都由ExecutorService调用。下面是一些代码: private void retrieveDataFiles() { if (this.urlsToRetrieve.size() > 0) { System.out.println("Target URLs to retrieve: " + this.urlsToRetrieve.size());

我正在开发一个从不同URL检索文件的应用程序

有一个树集包含要下载的目标。这在一个循环中处理,每个项都由ExecutorService调用。下面是一些代码:

private void retrieveDataFiles() {
    if (this.urlsToRetrieve.size() > 0) {
        System.out.println("Target URLs to retrieve: " + this.urlsToRetrieve.size());
        ExecutorService executorProcessUrls = Executors.newFixedThreadPool(this.urlsToRetrieve.size());//could use fixed pool based on size of urls to retrieve
        for (Entry target : this.urlsToRetrieve.entrySet()) {
            final String fileName = (String) target.getKey();
            final String url = (String) target.getValue();

            String localFile = localDirectory + File.separator + fileName;
            System.out.println(localFile);
            executorProcessUrls.submit(new WikiDumpRetriever(url, localFile));
            dumpFiles.add(localFile); 
            //TODO: figure out why only 2 files download
        }
        executorProcessUrls.shutdown();
        try {
            executorProcessUrls.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
        } catch (InterruptedException ex) {
            System.out.println("retrieveDataFiles InterruptedException: " + ex.getMessage());
        }
    } else {
        System.out.println("No target URL's were retrieved");
    }
}
然后,WikiDumpRetriever:

private static class WikiDumpRetriever implements Runnable {

    private String wikiUrl;
    private String downloadTo;

    public WikiDumpRetriever(String targetUrl, String localDirectory) {
        this.downloadTo = localDirectory;
        this.wikiUrl = targetUrl;
    }

    public void downloadFile() throws FileNotFoundException, IOException, URISyntaxException {
        HTTPCommunicationGet httpGet = new HTTPCommunicationGet(wikiUrl, "");
        httpGet.downloadFiles(downloadTo);
    }

    @Override
    public void run() {
        try {
            downloadFile();
        } catch (FileNotFoundException ex) {
            System.out.println("WDR: FileNotFound " + ex.getMessage());
        } catch (IOException ex) {
            System.out.println("WDR: IOException " + ex.getMessage());
        } catch (URISyntaxException ex) {
            System.out.println("WDR: URISyntaxException " + ex.getMessage());
        }
    }
}
正如您所看到的,这是一个内部类。树集包含:

关键词:价值

enwiki-latest-pages-articles.xml.bz2:

elwiki-latest-pages-articles.xml.bz2:

zhwiki-latest-pages-articles.xml.bz2:

hewiki-latest-pages-articles.xml.bz2:

问题是这个过程下载了四个文件中的两个。我知道这四个都是可用的,我知道它们可以下载。但是,在任何时候只有两个进程

有人能帮我解释一下吗?我错过了什么,或者我做错了什么

谢谢
nathj07

多亏了佩特卡——这是来自源头的限制。因此,为了克服这个问题,我将固定线程池大小设置为2。这意味着只有2个文件同时下载

然后,答案是找到供应商施加的限制并设置线程池:

ExecutorService executorProcessUrls = Executors.newFixedThreadPool(2);
我想接受一个答案,但似乎无法接受这些评论。抱歉,如果这是错误的方式


感谢所有的建议,“集体思考”真的帮助我解决了这个问题。

多亏了佩特卡,这是一个来自源头的限制。因此,为了克服这个问题,我将固定线程池大小设置为2。这意味着只有2个文件同时下载

然后,答案是找到供应商施加的限制并设置线程池:

ExecutorService executorProcessUrls = Executors.newFixedThreadPool(2);
我想接受一个答案,但似乎无法接受这些评论。抱歉,如果这是错误的方式


感谢所有的提示,“集体思考”真的帮我解决了这个问题。

你试过使用调试器吗?你发现了什么?所有的线程都被执行了吗?实际下载或写入文件系统时,哪些情况没有发生?操作系统是否有限制,一次只允许两个并发连接到一台服务器?您能从浏览器下载所有四个吗?可能页面限制您一次只能同时下载两个流!大家好,谢谢大家过来考虑一下。我可以从浏览器中成功地下载它们,但我没有尝试同时下载。从本质上讲,进程下载列出的四个文件中的两个,下载的两个似乎是随机的是关闭线程/中断线程的执行吗?您是否尝试过使用调试器?你发现了什么?所有的线程都被执行了吗?实际下载或写入文件系统时,哪些情况没有发生?操作系统是否有限制,一次只允许两个并发连接到一台服务器?您能从浏览器下载所有四个吗?可能页面限制您一次只能同时下载两个流!大家好,谢谢大家过来考虑一下。我可以从浏览器中成功地下载它们,但我没有尝试同时下载。从本质上讲,进程下载列出的四个文件中的两个,下载的两个似乎是随机的是否关闭线程/中断踏板的执行?