Java 我们如何绑定ForJoinPool中使用的线程数?
我有8核CPU,我将把一个递归任务并行化为几个子任务。问题是我不希望线程的数量超过CPU核心的数量。所以,我有一节课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
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());