-1

我正在尝试使用 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);
    }
}

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

任何建议都将是可观的。

谢谢

4

3 回答 3

4

ACallable可以返回结果。当您向 executor 服务提交作业时,您将获得未来的回报。调用get()它会给你返回返回的结果,Callable这很可能是该特定下载的状态。

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

于 2012-09-12T19:31:47.723 回答
0

来自 Callable 的 Javadoc:

返回结果并可能引发异常的任务。实现者定义了一个没有参数的方法,称为 call。

从中汲取灵感,更改List<Callable<Void>> jobsList<Callable<Boolean>> jobs并类似地更改您的call方法的返回类型。使用它,完成任务后,您可以检查返回的状态。

于 2012-09-12T19:34:18.810 回答
0

使用ExecutorCompletionService

于 2012-09-12T19:30:06.803 回答