in surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/pc/ParallelComputerUtil.java [125:158]
private static Concurrency estimateConcurrency(JUnitCoreParameters params, RunnerCounter counts) {
final Concurrency concurrency = new Concurrency();
final int parallelEntities = countParallelEntities(params);
concurrency.capacity = multiplyByCoreCount(params, params.getThreadCount());
if (parallelEntities == 1 || counts == null || counts.classes == 0) {
// Estimate parallel thread counts.
double ratio = 1d / parallelEntities;
int threads = multiplyByCoreCount(params, ratio * params.getThreadCount());
concurrency.suites = params.isParallelSuites() ? minSuites(threads, counts) : 0;
concurrency.classes = params.isParallelClasses() ? minClasses(threads, counts) : 0;
concurrency.methods = params.isParallelMethods() ? minMethods(threads, counts) : 0;
if (parallelEntities == 1) {
concurrency.capacity = 0;
} else {
adjustLeaf(params, concurrency);
}
} else {
// Try to allocate suites+classes+methods within threadCount,
concurrency.suites = params.isParallelSuites() ? toNonNegative(counts.suites) : 0;
concurrency.classes = params.isParallelClasses() ? toNonNegative(counts.classes) : 0;
concurrency.methods =
params.isParallelMethods() ? toNonNegative(Math.ceil(counts.methods / (double) counts.classes)) : 0;
double sum = toNonNegative(concurrency.suites + concurrency.classes + concurrency.methods);
if (concurrency.capacity < sum && sum != 0) {
// otherwise allocate them using the weighting factor < 1.
double weight = concurrency.capacity / sum;
concurrency.suites *= weight;
concurrency.classes *= weight;
concurrency.methods *= weight;
}
adjustLeaf(params, concurrency);
}
return concurrency;
}