私はあなたがカスタムForkJoinPoolなしでparallelStream
を使用すると、デフォルトでForkJoinPoolを使用することを知っています。 (そしてまた、その質問の他の回答で)stated hereようなぜ並列ストリームはForkJoinPoolのすべてのスレッドを使用しないのですか?
、より多くの並列性を有するために、あなたがする必要があります。
は、あなた自身のForkJoinPoolに並列ストリームの実行を提出する:yourFJP.submit( () - > stream.parallel()。forEach(doSomething));
だから、私はこれをしなかった:
import java.util.Set;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ForkJoinPool;
import java.util.stream.IntStream;
import com.google.common.collect.Sets;
public class Main {
public static void main(String[] args) throws InterruptedException, ExecutionException {
ForkJoinPool forkJoinPool = new ForkJoinPool(1000);
IntStream stream = IntStream.range(0, 999999);
final Set<String> thNames = Collections.synchronizedSet(new HashSet<String>());
forkJoinPool.submit(() -> {
stream.parallel().forEach(n -> {
System.out.println("Processing n: " + n);
try {
Thread.sleep(500);
thNames.add(Thread.currentThread().getName());
System.out.println("Size: " + thNames.size() + " activeCount: " + forkJoinPool.getActiveThreadCount());
} catch (Exception e) {
throw new RuntimeException(e);
}
});
}).get();
}
}
は、私が作成した、ともプールがあり、アクティブなスレッドの数をログに記録されているどのように多くのスレッドを見るために、スレッド名のセットを作って、両方の数値が16以上にならないので、ここでの並列性は16以上ではありません(なぜ16ですか?)。 forkJoinPoolを使用しないと、私は4つの並列性を得ています。これは、私が持っているプロセッサーの数に従います。
なぜ1000ではなく16であるのですか?
@DavidSchwartzしかし、私が参照した記事をチェックしてください。そこには、これを行うと、親プールのすべてのスレッドが使用されます。 –
ああ、 'thNames'自体はスレッドセーフではなく、多くのスレッドから参照して変更しようとしていることに注意してください。 –
また、私は思っていません - そうは思わないですが、ストリームの構築を '.submit'に渡すラムダに移そうとするかもしれません。 –