Mediumasync

Что такое @Async в Spring?

1Постановка

Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.

2Решение

@Async — метод выполняется в отдельном потоке, не блокируя caller. Spring создаёт proxy, отправляет в TaskExecutor.

@EnableAsync
@SpringBootApplication
public class App { /* ... */ }

@Service
public class EmailService {
    @Async("asyncExecutor")
    public CompletableFuture<Void> sendEmail(String to) {
        // long-running: HTTP call, SMTP
        return CompletableFuture.completedFuture(null);
    }
}

@Bean
public TaskExecutor asyncExecutor() {
    ThreadPoolTaskExecutor e = new ThreadPoolTaskExecutor();
    e.setCorePoolSize(10);
    e.setMaxPoolSize(100);
    e.setQueueCapacity(50);
    e.initialize();
    return e;
}
  • Возвращаемые типы: void (fire-and-forget), CompletableFuture<T>;
  • Self-invocation — proxy не используется, синхронный вызов;
  • Только public методы;
  • По умолчанию SimpleAsyncTaskExecutor (новый поток каждый раз — bad для production);
  • С virtual threads (Spring Boot 3.2): spring.threads.virtual.enabled=true.

3Как отвечать

  • Сначала уточните условия и ограничения, покажите аналитическое мышление.
  • Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
  • Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡

На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.