、それは、おそらくよりパフォーマンスよりクリーンだとあなたを可能にしますが(スレッド数、スレッド名など)の上に、後に、より簡単に物事を変更するには:
ExecutorService pool = Executors.newFixedThreadPool(10);
for (String name : fileNames) {
pool.submit(new DownloadTask(name, toPath));
}
pool.shutdown();
pool.awaitTermination(Long.MAX_VALUE, TimeUnit.MILLISECONDS);
// all tasks have now finished (unless an exception is thrown above)
そしてどこか他のあなたのクラスでは、実際の仕事の馬を定義DownloadTask
:それは「以前に提出したタスクが終了する前に実行できるようになります」ので
private static class DownloadTask implements Runnable {
private String name;
private final String toPath;
public DownloadTask(String name, String toPath) {
this.name = name;
this.toPath = toPath;
}
@Override
public void run() {
// surround with try-catch if downloadFile() throws something
downloadFile(name, toPath);
}
}
shutdown()
方法は、非常に紛らわしい名称を持っています。 awaitTermination()
は処理する必要があるInterruptedException
と宣言します。
これは 'DownloadTask'(私の推薦)の中で' downloadFile() 'メソッドを定義するか、外部で' static'宣言する必要があります。 –
'@Philipp Reichart'シャットダウン後に新しいダウンロードタスクがプールに受け入れられません。もし私があなただったら、これを避けるでしょう。 – Bitmap
この場合、プールがシャットダウンされた後にプールに新しいタスクが追加されないため、これは問題にはなりません。最初のコードスニペットはメソッド内に存在するはずであり、すべての呼び出しで新しいプールを作成します。 –