Phase 17 of 20 · Topic 17.5

Parallel Streams & ForkJoinPool Execution Mechanics

1Concept

Calling `.parallelStream()` partitions data using a `Spliterator` across multiple CPU threads managed by the JVM `ForkJoinPool.commonPool()`. While parallel streams can drastically accelerate CPU-bound number crunching, they degrade performance on small datasets or I/O-bound tasks due to thread coordination overhead.

2Architecture Diagram

Source Dataset (1 Million items)
       |
       v Fork (Spliterator partitions data)
[ Core 0 Worker ] [ Core 1 Worker ] [ Core 2 Worker ] [ Core 3 Worker ]
       \                 \                 /                 /
        v                 v               v                 v
        -----------------> Join (Combines Results) <---------

3Code Example

Core Java
import java.util.List;
import java.util.stream.LongStream;

public class ParallelStreamDemo {
    public static void main(String[] args) {
        long n = 10_000_000L;

        long start = System.currentTimeMillis();
        // Multi-core parallel sum
        long sum = LongStream.rangeClosed(1, n)
            .parallel()
            .reduce(0L, Long::sum);

        long elapsed = System.currentTimeMillis() - start;
        System.out.println("Computed Sum: " + sum);
        System.out.println("Parallel computation time: " + elapsed + " ms");
        System.out.println("CommonPool Parallelism: " + java.util.concurrent.ForkJoinPool.getCommonPoolParallelism());
    }
}

4Expected Output

Computed Sum: 50000005000000
Parallel computation time: 42 ms
CommonPool Parallelism: 7

5Key Takeaways

  • Never run blocking I/O calls inside standard `.parallelStream()`; it starves the shared ForkJoinPool.commonPool.
  • Spliterator efficiency dictates speedup: ArrayList splits well; LinkedList splits poorly.
  • Parallel operations must be stateless, non-interfering, and associative.