2017-07-06 4 views
0

私の状況はとても簡単です。java 8並列ストリーム、ブロックコードが可能ですか?

私はリストを持っています。各項目に対して非同期にロジックを実行したいと思います。

すべてのスレッドが完了すると、私はクローズ接続を呼び出したいと思います。そのような

bucketsList.parallelStream().forEach(t -> { 
//some logic 
}); 
try { 
RestApi.getInstance().closeClientConnection(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

は、そのオブジェクトのすべてを通過終了する並列ストリームのためcloseConnectionの一部を待機させる方法はありますか?

EDIT:私はまだブロックされてParallelStreamにbucketsList

答えて

4

操作になりますし、それがフィニッシュに生み出されたすべてのスレッドをお待ちしていますどのように多くのアイテムを知らないよう 私はCountDownLatchを使用することはできません。これらのスレッドは非同期に実行されます(前のスレッドが終了するのを待つことはありません)が、コード全体が非同期で動作するようになるわけではありません。

あなたが実際に非同期呼び出しを行うと、あなたのforEachその結果CompletableFuture<T>で作業している場合は、代わりにあなたの端末操作単一CompletableFuture<T>を生成reduce行う必要があります。中間処理は、副作用を伴うpeekまたはID map(どちらも悩まされていますが、ベストプラクティスの解決策はわかりません)の可能性があります。あなたは単一の解決の結果、CompletableFuture<T>の結果として接続を閉じるでしょう。

closeClientConnection()は、ParallelStreamが処理された後にのみ実行されるため、十分ではありません。

+0

本当に正しいです!私は私のカウンタをリセットする別の問題を抱えていたように思えます(ロジックは私も非同期でした。一度私はリセットカウンタの問題を修正このコードが働いた! –

関連する問題