diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/condition/OnClassCondition.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/condition/OnClassCondition.java index 80239abf2c3..b23b1a8a567 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/condition/OnClassCondition.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/condition/OnClassCondition.java @@ -49,6 +49,25 @@ class OnClassCondition extends FilteringSpringBootCondition { // Split the work and perform half in a background thread. Using a single // additional thread seems to offer the best performance. More threads make // things worse + if (Runtime.getRuntime().availableProcessors() > 1) { + return resolveOutcomesThreaded(autoConfigurationClasses, + autoConfigurationMetadata); + } + else { + return resolveOutcomes(autoConfigurationClasses, autoConfigurationMetadata); + } + } + + private ConditionOutcome[] resolveOutcomes(String[] autoConfigurationClasses, + AutoConfigurationMetadata autoConfigurationMetadata) { + OutcomesResolver outcomesResolver = createOutcomesResolver( + autoConfigurationClasses, 0, autoConfigurationClasses.length, + autoConfigurationMetadata); + return outcomesResolver.resolveOutcomes(); + } + + private ConditionOutcome[] resolveOutcomesThreaded(String[] autoConfigurationClasses, + AutoConfigurationMetadata autoConfigurationMetadata) { int split = autoConfigurationClasses.length / 2; OutcomesResolver firstHalfResolver = createOutcomesResolver( autoConfigurationClasses, 0, split, autoConfigurationMetadata);