Java ForkJoinPool线程数设置疑问:parallelism参数含义与配置有效性
Answers to Your ForkJoinPool Questions
Let’s walk through your questions clearly—I’ve worked extensively with ForkJoinPool for parallel task processing in Java, so I can break this down for you:
1. How to set the number of threads in ForkJoinPool?
You have a few straightforward options:
- Direct constructor configuration: Use the
ForkJoinPool(int parallelism)constructor you referenced, passing the exact number of worker threads you want the pool to maintain. - Default pool behavior: The no-arg
ForkJoinPool()constructor usesRuntime.getRuntime().availableProcessors()as the default parallelism value for the pool. - Global system property: Set the JVM argument
-Djava.util.concurrent.ForkJoinPool.common.parallelism=X(replaceXwith your desired thread count) to configure the parallelism of the common ForkJoinPool used by APIs likeparallelStream()when no explicit pool is specified.
2. Does the parallelism parameter represent thread count or processor count?
It represents the target number of parallel worker threads, not the number of processors. The official documentation mentions subtasks can run on different CPUs or threads of the same CPU to explain the execution model of ForkJoinPool, but the parallelism parameter is your explicit setting for how many active threads the pool should use to process tasks in parallel.
3. Is new ForkJoinPool(8) invalid when Runtime.getRuntime().availableProcessors() returns 4?
Absolutely not. The pool will still create and manage 8 worker threads as you specified. While having more threads than available CPU cores introduces some context-switching overhead, it’s not "invalid"—the OS will schedule those 8 threads across your 4 CPU cores, and the pool will execute your tasks using all 8 threads.
Note on Your Example Code
A quick observation about your code: when you wrap a parallelStream() call inside a task submitted to your custom ForkJoinPool, the parallelStream() will actually use your custom pool (instead of the default common pool) for its parallel execution. This means your 300-string list will be processed using the 8 threads you configured. If you run this code, you’ll notice batches of 8 strings being printed roughly every second (since each test() call sleeps for 1 second), which confirms the 8-thread pool is working as expected.
内容的提问来源于stack exchange,提问作者Almas Abdrazak

