我正在尝试使用线程下载与模式匹配的多个文件。该模式可以匹配 1、5 或 10 个不同大小的文件。
为了简单起见,下载文件的实际代码位于 downloadFile() 方法中,而 fileNames 是与模式匹配的文件名列表。我如何使用线程来做到这一点。每个线程只会下载一个文件。是否建议在 for 循环内创建一个新线程。
for (String name : fileNames){
downloadFile(name, toPath);
}
你确实想使用执行服务 http://download.oracle.com/javase/6/docs/api/java/util/concurrent/ExecutorService.html它比单个线程更干净,可能更高效,并且使您能够在以后更轻松地更改内容(线程计数、线程名称等):
ExecutorService pool = Executors.newFixedThreadPool(10);
for (String name : fileNames) {
pool.submit(new DownloadTask(name, toPath));
}
pool.shutdown();
pool.awaitTermination(Long.MAX_VALUE, TimeUnit.MILLISECONDS);
// all tasks have now finished (unless an exception is thrown above)
在班级的其他地方定义实际的工作马DownloadTask
:
private static class DownloadTask implements Runnable {
private String name;
private final String toPath;
public DownloadTask(String name, String toPath) {
this.name = name;
this.toPath = toPath;
}
@Override
public void run() {
// surround with try-catch if downloadFile() throws something
downloadFile(name, toPath);
}
}
The shutdown()
方法有一个非常令人困惑的名称,因为它“将允许先前提交的任务在终止之前执行”。awaitTermination()
声明一个InterruptedException
你需要处理。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)