ベルトランセドリック:
私は複数のREST呼び出しを処理し、いくつかのJavaコード、に取り組んでいます
call1()
call2()
call3()
...
私はこれらの呼び出しを並列化したいのですが、同期私のメインのコードを実行します。私は、ラムダと並列ストリームでPOCを作りました:
List<Runnable> list = new ArrayList();
list.add(() -> {call1()});
list.add(() -> {call2()});
list.add(() -> {call3()});
list.add(...);
list.parallelStream()
.forEach(Runnable::run);
あなたは別のソリューションを持っていますか?私はまた、代わりにジャージーのクライアントからの呼び出し非同期(async)を使用するために検査が、これはより多くのコードの変更が必要になります。
ernest_k:
あなたが探しているすべての非同期あなたの呼び出しを実行することです。あなたは使用することができますCompletableFuture
タスクを送信し、それらが完了するのを待つ秒:
list.stream() //you don't really need a parallel stream
.map(CompletableFuture::runAsync)
.collect(Collectors.toList()) //make sure all tasks are submitted
.stream()
.forEach(CompletableFuture::join);
これは、(非同期で実行するために)すべてのタスクを提出し、それらのそれぞれが実行を終了するのを待ちます。そのような場合は、この方法が返されます。
あなたの非同期タスクのためにスレッドプールを制御する必要があるかもしれません。これは、10スレッドプールを使用した例です。
ExecutorService es = Executors.newFixedThreadPool(10);
list.stream()
.map(r -> CompletableFuture.runAsync(r, es))
...