我正在尝试使用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。