5

httpを介してパートナーサイトから10〜20枚の画像をインポートする必要があるWebアプリケーションがあります。ダウンロードしたいURLを表す文字列のリストがある場合、それらをできるだけ速くダウンロードする方法について誰かが提案を持っていますか?

それらをforループに入れることもできますが、これを並列化する簡単な方法があれば、エンドユーザーにとってはおそらく良いでしょう。エグゼキュータフレームワークは良い考えかもしれませんが、私はストレートJavaスレッドの使用を避けたいと思います。

何か案は?

4

3 に答える 3

5

これがRestyを使った私の見解です。(免責事項:私は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());
        }
    }

}
于 2011-05-23T23:27:24.080 に答える
1

Executorフレームワークは、まさにあなたが望むものです。具体的には、ExecutorCompletionServiceです。これを使用すると、リクエストをすばやく任意の順序で送信できます。次に、(送信順序ではなく)完了したとおりにそれらを取得します。

于 2011-05-23T23:12:08.823 に答える
0

Resty Libraryの使用画像は、次のようにカスタム名でダウンロードできます。

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();

    }
于 2013-11-11T09:27:04.877 に答える