Java Spring MVC中for循环的线程化
我有一个SpringMVC应用程序。 我需要实现线程for循环 情况如下所述。 一个文件夹中有多个文件,并且有多个文件夹。 必须从每个文件夹并行下载文件。 但特定文件夹中的文件必须按顺序下载。即 如果有N个文件夹,那么在某个时间点,将同时下载N个文件 下面给出了示例代码Java Spring MVC中for循环的线程化,java,multithreading,spring,spring-mvc,Java,Multithreading,Spring,Spring Mvc,我有一个SpringMVC应用程序。 我需要实现线程for循环 情况如下所述。 一个文件夹中有多个文件,并且有多个文件夹。 必须从每个文件夹并行下载文件。 但特定文件夹中的文件必须按顺序下载。即 如果有N个文件夹,那么在某个时间点,将同时下载N个文件 下面给出了示例代码 private FolderServiceManager folderServiceManager; private FileRequestService fileRequestService; ...... ...... @O
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();
}
}
私有FolderServiceManager FolderServiceManager;
私有文件请求服务文件请求服务;
......
......
@凌驾
公共无效下载文件(){
ExecutorService exec=Executors.newFixedThreadPool(5);
List listOfFolders=folderServiceManager.getAllFolders();
试一试{
用于(最终文件夹:listOfFolders){
exec.submit(新的Runnable(){
@凌驾
公开募捐{
下载MP4文件(文件夹);
}
});
}
}最后{
exec.shutdown();
}
}
在任何地方,在任何其他代码中都不再是并行化
我的问题是,给定的代码是否符合目的
Springbean的范围是默认范围。是否需要更改SpringBeans的范围?考虑改用
它将帮助您更好地控制执行。具体来说,你可能想有一个习惯;在处理文件系统读取时,很有可能会出现长时间运行/挂起的线程,这最终可能会导致应用程序不负责任。我相信该代码可以达到目的。如果您认为可能发生的话,您可能需要考虑处理长时间运行的线程。 解决此问题的另一种方法是使用
CompletableFuture
类(Java8)。代码会更干净一些(据我说)
//设置执行器
ExecutorService exec=Executors.newFixedThreadPool(5);
//创建所有下载作业的数组
final CompletableFuture[]downloads=folderServiceManager.getAllFolders()
.stream()
.map(文件夹->CompletableFuture.runAsync(
()->fileRequestService.downloadMp4Files(文件夹),exec)
)//创建未来
.toArray(大小->新的CompletableFuture[大小];//将其收集为数组
//如果要等待期货完成,可以使用allOf方法。
//如果你不想等待,你可以跳过这些行。。。
final CompletableFuture allDownloads=CompletableFuture.allOf(下载);
allDownloads.get();
// 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();