作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 Spring MVC 应用程序。我需要实现线程化的 for 循环。
情况描述如下。一个文件夹里面有多个文件,还有很多文件夹。必须从每个文件夹并行下载文件。但是来自特定文件夹的文件必须按顺序下载。 IE如果有N个文件夹,那么在某个时间点,会同时下载N个文件。
示例代码如下
private FolderServiceManager folderServiceManager;
private FileRequestService fileRequestService;
......
......
@Override
public void downloadFiles(){
ExecutorService exec = Executors.newFixedThreadPool(5);
List<Folder> listOfFolders = folderServiceManager.getAllFolders();
try {
for (final Folder folder: listOfFolders) {
exec.submit(new Runnable() {
@Override
public void run() {
fileRequestService.downloadMp4Files(folder);
}
});
}
} finally {
exec.shutdown();
}
}
在任何地方的任何其他代码中不再有并行化。
我的问题是,给定的代码是否符合目的?
spring bean的作用域是默认的。我需要更改 spring bean 的范围吗?
最佳答案
我相信该代码已达到其目的。如果您认为它可能会发生,您可能需要考虑处理长时间运行的线程。
解决该问题的另一种方法是使用 CompletableFuture
类 (Java 8)。代码会更清晰一些(根据我的说法)。
// Setup the Executor
ExecutorService exec = Executors.newFixedThreadPool(5);
// Create an array of all download jobs
final CompletableFuture[] downloads = folderServiceManager.getAllFolders()
.stream()
.map(folder -> CompletableFuture.runAsync(
() -> fileRequestService.downloadMp4Files(folder), exec)
) // Create the futures
.toArray(size -> new CompletableFuture[size]); // Collect it as an array
// If you want to wait for the futures to complete the allOf-method can be used.
// If you don't want to wait you can skip these lines...
final CompletableFuture<Void> allDownloads = CompletableFuture.allOf(downloads);
allDownloads.get();
关于java - 在 Spring MVC 中线程化 for 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27729865/
我是一名优秀的程序员,十分优秀!