java中的多线程文件下载

时间:2012-09-12 19:26:48

标签: java multithreading

我正在尝试使用ExecutorService实现多线程并行下载文件。以下是我的代码

   public void downloadFiles(List<String> filenames, final String fileSavePath) {
    if (filenames != null && filenames.size() > 0) {
        List<Callable<Void>> jobs = new ArrayList();
        for (final String fileName : filenames) {
            jobs.add(new Callable() {
                public Void call() throws Exception {
                    downloadFile(fileName, fileSavePath);
                    return null;
                }
            });
        }
        performJobs(jobs);
    }
}

我的要求是,我希望在成功下载所有文件后从此方法返回状态。我不知道该怎么做。我无法从外部类访问内部类的变量。

任何建议都会很明显。

由于

3 个答案:

答案 0 :(得分:4)

Callable可以返回结果。当您向执行者服务提交作业时,您将来会回来。在其上调用get()将返回Callable返回的结果,这很可能是该特定下载的状态。

在您的特定示例中,不返回null,而是返回下载文件的结果。另一种方法是在callables之间使用共享的线程安全队列,并将状态添加到该队列(尽管这是一种迂回的做事方式)。您还可以使用此类技巧在UI等上“更新”某些状态。

答案 1 :(得分:0)

答案 2 :(得分:0)

来自Callable的Javadoc:

  

返回结果并可能抛出异常的任务。实施者   定义一个没有名为call的参数的单个方法。

从中获取提示,将List<Callable<Void>> jobs更改为List<Callable<Boolean>> jobs,同样更改call方法的返回类型。使用此功能,完成任务后,您可以检查返回的状态。