データベースから2つの並列読み取りを実装しました。 最初の実装では、ExecutorService
とnewCachedThreadPool()
コンストラクタと先物を使用しています。私は単に、読んでいるケースごとに将来を返すコールを行い、すべての呼び出しを行った後、get()
を呼び出します。この実装は正常に機能し、十分に高速です。Java並列ストリームは、newCachedThreadPool()を使用するときに最適なスレッド数を使用しません。
第2の実装では、並列ストリームを使用しています。私は並列ストリームコールを同じExecutorService
プールに入れるとほとんど5倍遅くなりますと私は望むほど多くのスレッドを使用していないようです。私は代わりにForkJoinPool pool = new ForkJoinPool(50)
にそれを入れると、以前の実装と同じくらい速く動作します。
私の質問は:
なぜアンダー利用newCachedThreadPool
バージョンでスレッドを並列ストリーム?これはForkJoinTask.forkが実装されているどのように関係している
private static final ExecutorService pool = Executors.newCachedThreadPool();
final List<AbstractMap.SimpleImmutableEntry<String, String>> simpleImmutableEntryStream =
personIdList.stream().flatMap(
personId -> movieIdList.stream().map(
movieId -> new AbstractMap.SimpleImmutableEntry<>(personId, movieId))).collect(Collectors.toList());
final Future<Map<String, List<Summary>>> futureMovieSummaryForPerson = pool.submit(() -> {
final Stream<Summary> summaryStream = simpleImmutableEntryStream.parallelStream().map(
inputPair -> {
return FeedbackDao.find(inputPair.getKey(), inputPair.getValue());
}).filter(Objects::nonNull);
return summaryStream.collect(Collectors.groupingBy(Summary::getPersonId));
});
あなたのコード –
を表示してください:「ForkJoinPoolプール=新しいForkJoinPool(50);」それは再び速く働く。 –
あなたのコードによれば、あなたはタスクだけを提出しますか?または私は何かが恋しい? –