我有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();
}
}
现在,我想按照以下方式创建ForkJoinPool:
public static void main(String[] args) {
byte[] bytes;
//Obtaining bytes of an image and set their to bytes
new ForkJoinPool().invoke(new ValueSumCounter(bytes));
}
我不知道在此调用期间将创建多少线程。如何明确地将线程数限制为小于核心数(在我的情况下为8)?
答案 0 :(得分:2)
您可以使用int作为Constructor参数(http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ForkJoinPool.html#ForkJoinPool-int-)创建ForkJoinPool, 因此,您可以控制ForkJoinPool将使用的工作线程数。在你的情况下,你想拥有8,因为你有8个核心,可以这样称呼:
new ForkJoinPool(Runtime.getRuntime().availableProcessors());
编辑: 由于“isnot2bad”注意到您实际上不需要指定工作线程的数量,因为无参数构造函数已经使用了您想要的数字: http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ForkJoinPool.html#ForkJoinPool--
我忽略了这一点,谢谢你的补充。