java中的多线程文件下载



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

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

任何建议都是值得赞赏的。

感谢

Callable可以返回一个结果。当你向遗嘱执行人服务提交一份工作时,你会得到一份未来。在上面调用get()会返回Callable返回的结果,这很可能是特定下载的状态。

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

从可调用的Javadoc:

返回结果并可能引发异常的任务。实施者定义一个不带参数的方法call。

以此为线索,将List<Callable<Void>> jobs更改为List<Callable<Boolean>> jobs,并类似地更改call方法的返回类型。使用此功能,在任务完成后,您可以检查返回的状态。

使用ExecutiorCompletionService。

最新更新