При отсутствии в контексте бина Executor, Spring Boot автоматически конфигурирует ThreadPoolTaskExecutor с адекватными значениями по умолчанию, которые могут быть автоматически связаны с асинхронным выполнением задач (аннотация @EnableAsync) и асинхронной обработкой запросов в Spring MVC.

Если вы определили кастомный Executor в контексте, при обычном выполнении задачи (то есть с аннотацией @EnableAsync) он будет использоваться прозрачно, но средства поддержки Spring MVC не будут сконфигурированы, так как для этого требуется реализация AsyncTaskExecutor (с именем applicationTaskExecutor). В зависимости от вашей целевой организации, можно изменить Executor на ThreadPoolTaskExecutor или определить как ThreadPoolTaskExecutor, так и AsyncConfigurer, обертывающие ваш кастомный Executor.

Автоконфигурируемый TaskExecutorBuilder позволяет с легкостью создавать экземпляры, воспроизводящие то, что автоконфигурация делает по умолчанию.

Пул потоков использует 8 основных потоков, число которых может увеличиваться и уменьшаться в зависимости от нагрузки. Эти параметры по умолчанию можно точно настроить при помощи пространства имен spring.task.execution, как показано в следующем примере:

Properties
spring.task.execution.pool.max-size=16
spring.task.execution.pool.queue-capacity=100
spring.task.execution.pool.keep-alive=10s
Yaml
spring:
  task:
    execution:
      pool:
        max-size: 16
        queue-capacity: 100
        keep-alive: "10s"

Этот код изменяет пул потоков для использования очереди с ограничением на длину, поэтому, если очередь заполняется (100 задач), пул потоков увеличивается до максимальных 16 потоков. Сокращение пула происходит более агрессивно, поскольку потоки восстанавливаются, если они простаивают в течение 10 секунд (а не 60 секунд по умолчанию).

Планировщик ThreadPoolTaskScheduler также может быть автоматически сконфигурирован, если его необходимо связать с выполнением спланированных задач (например, с помощью аннотации @EnableScheduling). Пул потоков по умолчанию использует один поток, но его параметры можно точно настроить с помощью пространства имен spring.task.scheduling, как показано в следующем примере:

Properties
spring.task.scheduling.thread-name-prefix=scheduling-
spring.task.scheduling.pool.size=2
Yaml
spring:
  task:
    scheduling:
      thread-name-prefix: "scheduling-"
      pool:
        size: 2

Бины TaskExecutorBuilder и TaskSchedulerBuilder доступны в контексте, если необходимо создать кастомный исполнитель или планировщик.