gpt4 book ai didi

java - 在 Spring MVC 中线程化 for 循环

转载 作者:行者123 更新时间:2023-11-30 11:10:19 25 4
gpt4 key购买 nike

我有一个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com