我正在尝试使用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);
}
}
我的要求是,我希望在成功下载所有文件后从此方法返回状态。我不知道该怎么做。我无法从外部类访问内部类的变量。
任何建议都会很明显。
由于
答案 0 :(得分:4)
Callable
可以返回结果。当您向执行者服务提交作业时,您将来会回来。在其上调用get()
将返回Callable
返回的结果,这很可能是该特定下载的状态。
在您的特定示例中,不返回null
,而是返回下载文件的结果。另一种方法是在callables之间使用共享的线程安全队列,并将状态添加到该队列(尽管这是一种迂回的做事方式)。您还可以使用此类技巧在UI等上“更新”某些状态。
答案 1 :(得分:0)
答案 2 :(得分:0)
来自Callable的Javadoc:
返回结果并可能抛出异常的任务。实施者 定义一个没有名为call的参数的单个方法。
从中获取提示,将List<Callable<Void>> jobs
更改为List<Callable<Boolean>> jobs
,同样更改call
方法的返回类型。使用此功能,完成任务后,您可以检查返回的状态。