多くの URL を処理する必要がある Java プログラムを作成しています。
各 URL は次のジョブを順番に実行します: ダウンロード、分析、圧縮
URL ごとに 1 つのスレッドですべてのジョブを一度に実行するのではなく、各ジョブに一定量のスレッドを持たせて、すべてのジョブで同時にスレッドが常に実行されるようにします。
たとえば、ダウンロード ジョブには、URL を取得してダウンロードするための複数のスレッドがあり、URL の 1 つがダウンロードされるとすぐに分析ジョブのスレッドに渡され、完了するとすぐに次のスレッドに渡されます。圧縮ジョブのスレッドなど
終了するとすぐに結果を返すため、JavaでCompletionServiceを使用することを考えていますが、それがどのように機能するかわかりません。これまでのところ、私のコードは次のようになります。
ExecutorService executor = Executors.newFixedThreadPool(3);
CompletionService<DownloadedItem> completionService = new ExecutorCompletionService<DownloadedItem>(executor);
//while list has URL do {
executor.submit(new DownloadJob(list.getNextURL());//submit to queue for download
//}
//while there is URL left do {
Future<DownloadedItem> downloadedItem = executor.take();//take the result as soon as it finish
//what to do here??
//}
私の質問は、ダウンロードしたアイテムを分析ジョブに移動し、すべてのダウンロード ジョブが完了するのを待たずにそこで作業を行うにはどうすればよいですか? ジョブごとに CompletionService を作成することを考えていますが、それは実行可能な方法ですか? そうでない場合、この問題を解決するためのより良い代替方法はありますか? 例を挙げてください。