Java 我们如何绑定ForJoinPool中使用的线程数?

Java 我们如何绑定ForJoinPool中使用的线程数?,java,multithreading,Java,Multithreading,我有8核CPU,我将把一个递归任务并行化为几个子任务。问题是我不希望线程的数量超过CPU核心的数量。所以,我有一节课 public class ValueSumCounter extends RecursiveTask<Long>{ byte[] bytesToProcess; public ValueSumCounter(byte[] b) { this.bytesToProcess = b; } @Override pro

我有8核CPU,我将把一个递归任务并行化为几个子任务。问题是我不希望线程的数量超过CPU核心的数量。所以,我有一节课

public class ValueSumCounter extends RecursiveTask<Long>{
    byte[] bytesToProcess;
    public ValueSumCounter(byte[] b) {
        this.bytesToProcess = b;
    }

    @Override
    protected Long compute() {
        List<ValueSumCounter> tasksToCompute;
        //Obtaining list of tasks (more than 100)
    }        
    for(ValueSumCounter task : tasksToCompute) {
        task.join();
    }
}

我不知道在这个调用过程中会创建多少线程。如何将线程数量显式绑定到少于内核数量(在我的情况下为8)的范围内?

您可以使用int作为构造函数参数()创建ForkJoinPool, 因此,您可以控制ForkJoinPool将使用多少工作线程。在您的情况下,您希望有8个核,因为您有8个核,可以这样称呼它:

new ForkJoinPool(Runtime.getRuntime().availableProcessors());
编辑: 正如“isnot2bad”所指出的,实际上您不需要指定工作线程的数量,因为无参数构造函数已经使用了您想要的数量:


我忽略了这一点,谢谢你的添加。

请看@Jayan这是什么?并行级别意味着什么?ForkJoinPool的默认构造函数已经使用处理器数量来限制并行性。顺便说一句,JVM本身管理所有可用处理器上的线程执行。我说的对吗?据我所知是的。
new ForkJoinPool(Runtime.getRuntime().availableProcessors());