How many threads are spawned in parallelStream in Java 8?

前端 未结 2 1195
囚心锁ツ
囚心锁ツ 2020-11-29 01:28

In JDK8, how many threads are spawned when i\'m using parallelStream? For instance, in the code:

list.parallelStream().forEach(/** Do Something */);
<         


        
相关标签:
2条回答
  • 2020-11-29 02:17

    While @uraimo is correct, the answer depends on exactly what "Do Something" does. The parallel.streams API uses the CountedCompleter Class which has some interesting problems. Since the F/J framework does not use a separate object to hold results, long chains may result in an OOME. Also those long chains can sometimes cause a Stack Overflow. The answer to those problems is the use of the Paraquential technique as I pointed out in this article.

    The other problem is excessive thread creation when using nested parallel forEach.

    0 讨论(0)
  • 2020-11-29 02:24

    The Oracle's implementation[1] of parallel stream uses the current thread and in addition to that, if needed, also the threads that compose the default fork join pool ForkJoinPool.commonPool(), which has a default size equal to one less than the number of cores of your CPU.

    That default size of the common pool can be changed with this property:

    -Djava.util.concurrent.ForkJoinPool.common.parallelism=8
    

    Alternatively, you can use your own pool:

    ForkJoinPool myPool = new ForkJoinPool(8);
    myPool.submit(() ->
        list.parallelStream().forEach(/* Do Something */);
    ).get();
    

    Regarding the order, jobs will be executed as soon as a thread is available, in no specific order.

    As correctly pointed out by @Holger this is an implementation specific detail (with just one vague reference at the bottom of a document), both approaches will work on Oracle's JVM but are definitely not guaranteed to work on JVMs from other vendors, the property could not exist in a non-Oracle implementation and Streams could not even use a ForkJoinPool internally rendering the alternative based on the behavior of ForkJoinTask.fork completely useless (see here for details on this).

    0 讨论(0)
提交回复
热议问题