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通过http批量下载图像的好方法_Java_Multithreading_Download_Executor - Fatal编程技术网

使用Java通过http批量下载图像的好方法

使用Java通过http批量下载图像的好方法,java,multithreading,download,executor,Java,Multithreading,Download,Executor,我们有一个web应用程序,需要通过http从合作伙伴站点导入10-20个图像。如果我有一个字符串列表,表示我要下载的URL,有人对如何尽快下载它们有什么建议吗 我可以把它们放在一个for循环中,但是如果有一个简单的方法来并行化它,它可能会对最终用户有好处。我希望避免使用直接的Java线程,尽管executor框架可能是一个好主意 有什么想法吗?Executor框架正是您想要的。特别是ExecutorCompletionService。使用此功能,您将能够以任意顺序快速提交请求。然后,您将完全按照

我们有一个web应用程序,需要通过http从合作伙伴站点导入10-20个图像。如果我有一个字符串列表,表示我要下载的URL,有人对如何尽快下载它们有什么建议吗

我可以把它们放在一个for循环中,但是如果有一个简单的方法来并行化它,它可能会对最终用户有好处。我希望避免使用直接的Java线程,尽管executor框架可能是一个好主意


有什么想法吗?

Executor框架正是您想要的。特别是ExecutorCompletionService。使用此功能,您将能够以任意顺序快速提交请求。然后,您将完全按照完成的顺序检索它们(与提交顺序相反)。

这是我的看法。(免责声明:我是Resty的作者) 下载命令行中给出的所有URL并打印出文件名

package us.monoid.web.parallel;

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

import us.monoid.web.Resty;

public class Downloader {

    public static void main(String[] args) throws InterruptedException, ExecutionException {
        ExecutorService pool = Executors.newFixedThreadPool(10);
        List<Callable<File>> tasks = new ArrayList<Callable<File>>(args.length);
        for (final String url : args) {
            tasks.add(new Callable<File>() {
                public File call() throws Exception {
                    return new Resty().bytes(url).save(File.createTempFile("img", ".png"));
                }               
            });
        }
        List<Future<File>> results = pool.invokeAll(tasks);
        for (Future<File> ff : results) {
            System.out.println(ff.get());
        }
    }

}
package us.monoid.web.parallel;
导入java.io.File;
导入java.util.ArrayList;
导入java.util.List;
导入java.util.concurrent.Callable;
导入java.util.concurrent.ExecutionException;
导入java.util.concurrent.ExecutorService;
导入java.util.concurrent.Executors;
导入java.util.concurrent.Future;
导入us.monoid.web.Resty;
公共类下载程序{
公共静态void main(字符串[]args)引发InterruptedException、ExecutionException{
ExecutorService池=Executors.newFixedThreadPool(10);
列表任务=新的ArrayList(args.length);
for(最终字符串url:args){
tasks.add(newcallable()){
公共文件调用()引发异常{
返回新的Resty();
}               
});
}
列表结果=pool.invokeAll(任务);
对于(未来ff:结果){
System.out.println(ff.get());
}
}
}

使用Resty库图像可以下载自定义名称,如下所示

try {
        ExecutorService pool = Executors.newFixedThreadPool(Names.size());
         List<Callable<File>> tasks = new ArrayList<Callable<File>>(Names.size());

         for (final String url : Urls) {

             tasks.add(new Callable<File>() {
               public File call() throws Exception {

                     File f=new File(directory+iimage);

                     return new Resty().bytes(url).save(f);

                 }

             });
             i++;
         }
         i=0;
         List<Future<File>> results = pool.invokeAll(tasks);
         for (Future<File> ff : results) {
             System.out.println(ff.get());
         }
    } catch (ExecutionException e) {
        // TODO Auto-generated catch block
        fails++;
        e.printStackTrace();

    }
试试看{
ExecutorService池=Executors.newFixedThreadPool(Names.size());
列表任务=新的ArrayList(Names.size());
for(最终字符串url:url){
tasks.add(newcallable()){
公共文件调用()引发异常{
文件f=新文件(目录+iimage);
返回新的Resty().bytes(url).save(f);
}
});
i++;
}
i=0;
列表结果=pool.invokeAll(任务);
对于(未来ff:结果){
System.out.println(ff.get());
}
}捕获(执行例外){
//TODO自动生成的捕捉块
失败++;
e、 printStackTrace();
}

如果我不想更改图像名称,是否可以?我想使用与URL中相同的名称。