私は3つのWebサービスコールを並行して実行できます。したがって、私はそれらを実行する3スレッドの固定プールを使用しています。Java 7:並列タスクをバッチで実行する方法は?
ここでは、最初の3つの呼び出しが処理された後にのみ、並列に実行できる2つ以上のWebサービス呼び出しを処理します。
どうすればそれらをバッチすることができますか?バッチ内のものを並行して実行したい。また、すべてのバッチは、前のバッチが完了した後にのみ実行されます。
これまでのところ、私は3つのサービスしか扱っていません。どのようにそれらをバッチし、別の2つのサービスを使い始めることができますか?
ExecutorService peopleDataTaskExecutor = Executors.newFixedThreadPool(3);
Future<Collection<PeopleInterface>> task1 = null;
if (condition) {
task1 = peopleDataTaskExecutor.submit(buildTask1Callable(mycontext));
}
Future<Map<String, Task2Response>> task2 = peopleDataTaskExecutor.submit(buildTask2Callable(mycontext));
Future<Map<String, Task3Response>> task3 = null;
task3 = peopleDataTaskExecutor.submit(buildTask3Callable(mycontext));
peopleDataTaskExecutor.shutdown();
try {
peopleDataTaskExecutor.awaitTermination(10, TimeUnit.SECONDS);
} catch (InterruptedException e) {
}
Collection<PeopleInterface> task1Data = null;
try {
task1Data = task1 != null ? task1.get() : null;
} catch (InterruptedException | ExecutionException e) {
}
Map<String, Task2Response> task2Data = null;
try {
task2Data = task2.get();
} catch (InterruptedException | ExecutionException e) {
}
Map<String, Task3Response> task3Data = null;
if (task3 != null) {
try {
task3Data = task3.get();
} catch (InterruptedException | ExecutionException e) {
}
}
バッチを追加するときに未来を得る方法はありますか?さもなければ、リストから未来を得るための論理は、索引を通して混乱しているように見えます。 –
バッチを追加すると、先物のコレクションが取得されます。 1つの未来は 'submit()'を呼び出すことによってのみ得ることができます。しかし、後者の場合は、完了するかタイムアウトが切れるまでそれぞれの未来を待つことはあなたの責任です。だから、あなたがタスクのコレクションを持っている場合は、どちらかの方法で先物を反復する必要があります。 'invokeAll()'は、送信時に反復するよう強制しないので簡単です。 'submit()'では、タスクをサブミットし、結果を処理するために、2回反復する必要があります。 –