私はかなりのデータセットを持っていますが、遅いがクリーンなメソッドを呼び出し、最初のメソッドの結果に副作用を伴うファーストメソッドを呼び出したい。私は中間結果に興味がないので、私はそれらを収集したくないです。並列ストリームを連続して呼び出すと、すべての以前の操作が順次行われます。
明白な解決策は、パラレルストリームを作成し、スローコールを行い、ストリームを再びシーケンシャルにし、高速コールを行うことです。問題は、すべてのコードが単一スレッドで実行されていることです。実際の並列処理はありません。
例コード:
@Test
public void testParallelStream() throws ExecutionException, InterruptedException
{
ForkJoinPool forkJoinPool = new ForkJoinPool(Runtime.getRuntime().availableProcessors() * 2);
Set<String> threads = forkJoinPool.submit(()-> new Random().ints(100).boxed()
.parallel()
.map(this::slowOperation)
.sequential()
.map(Function.identity())//some fast operation, but must be in single thread
.collect(Collectors.toSet())
).get();
System.out.println(threads);
Assert.assertEquals(Runtime.getRuntime().availableProcessors() * 2, threads.size());
}
private String slowOperation(int value)
{
try
{
Thread.sleep(100);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
return Thread.currentThread().getName();
}
Iはsequential
を削除する場合、予想されるように実行されるコードは、しかし、明らかに、非並列動作は、複数のスレッドで呼び出すであろう。
一時的な収集を避けるために、このような動作についての参考資料や、何らかの方法をお勧めしますか?
あなたが引用した文章は、Java 8のバージョンとまったく同じです。クラスドキュメントの最後の段落と同じ場所にあります。一般に、詳細は、[パッケージのドキュメント](https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html#StreamOps)を参照してください(「パラレル化」を参照) )(パラレル/シーケンシャル・モードでのみならず(「特定の方法」(https://docs.oracle.com/javase/8/docs/api/java/util/stream/BaseStream.html#parallel--)よりも)たとえば、削減と比較してください)。 – Holger
よく目撃された!私はそれが[更新された]ことを知っていた(http://hg.openjdk.java.net/jdk9/dev/jdk/rev/d52b2d49bf04)(私は議論に参加していて[確信して](http://mail.openjdk。 java.net/pipermail/core-libs-dev/2015-August/034773.html)Stuartは 'concat'のために特別な注釈を追加しましたが、なんらかの理由で間違った場所を発見しました。投稿が編集されました。 –