-1

ファイルを並列にダウンロードするためにExecutorServiceを使用してマルチスレッドを実装しようとしています。以下は私のコードです

   public void downloadFiles(List<String> filenames, final String fileSavePath) {
    if (filenames != null && filenames.size() > 0) {
        List<Callable<Void>> jobs = new ArrayList();
        for (final String fileName : filenames) {
            jobs.add(new Callable() {
                public Void call() throws Exception {
                    downloadFile(fileName, fileSavePath);
                    return null;
                }
            });
        }
        performJobs(jobs);
    }
}

私の要件は、すべてのファイルが正常にダウンロードされた後、このメソッドからステータスを返したいということです。これを行う方法がわかりません。外部クラスから内部クラスの変数にアクセスできません。

どんなアドバイスもありがたいです。

ありがとう

4

3 に答える 3

4

ACallableは結果を返すことができます。エグゼキュータサービスにジョブを送信すると、将来が返されます。それを呼び出すget()と、によって返された結果が返されCallableます。これは、その特定のダウンロードのステータスである可能性があります。

特定の例では、をnull返す代わりに、ファイルをダウンロードした結果を返します。もう1つの方法は、呼び出し可能オブジェクト間で共有スレッドセーフキューを使用し、そのキューにステータスを追加することです(ただし、これは回りくどい方法です)。この種のトリックを使用して、UIなどのステータスを「更新」することもできます。

于 2012-09-12T19:31:47.723 に答える
0

ExecutorCompletionServiceを使用します。

于 2012-09-12T19:30:06.803 に答える
0

CallableのJavadocから:

結果を返し、例外をスローする可能性のあるタスク。実装者は、callと呼ばれる引数のない単一のメソッドを定義します。

これからヒントを得て、メソッドのreturnタイプをに変更List<Callable<Void>> jobsし、同様に変更します。これを使用して、タスクの完了後、返されたステータスを確認できます。List<Callable<Boolean>> jobscall

于 2012-09-12T19:34:18.810 に答える