Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring MVC中for循环的线程化_Java_Multithreading_Spring_Spring Mvc - Fatal编程技术网

Java Spring MVC中for循环的线程化

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

我有一个SpringMVC应用程序。 我需要实现线程for循环

情况如下所述。 一个文件夹中有多个文件,并且有多个文件夹。 必须从每个文件夹并行下载文件。 但特定文件夹中的文件必须按顺序下载。即 如果有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();
    }
}
私有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();