@Async("poolbeanname")
Function () {
}
Приведенный выше фрагмент будет выполняться асинхронно с использованием пула потоков, если у вас есть @EnableAsync
в классе конфигурации.
@Configuration
@EnableAsync
или
@SpringBootApplication
@EnableAsync
Когда асинхронный режимКогда Spring активирован, Spring будет искать пользовательский TaskExecutor или bean-компонент executor. Если он не найден, по умолчанию будет использоваться собственный taskExecutor.
Проверьте в журнале строку, в которой написано Initializing ExecutorService....
Из коробки этоговорит, что он инициализировал o.s.s.concurrent.ThreadPoolTaskExecutor
, который по умолчанию даст вам размер пула ядра 1.
Чтобы переопределить исполнителя, нужно только добавить фабричный метод в класс конфигурации для Executor
.
@Bean
public Executor threadPoolTaskExecutor() {
ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
threadPoolTaskExecutor.setCorePoolSize(10);
threadPoolTaskExecutor.setMaxPoolSize(50);
//etc...
return threadPoolTaskExecutor;
}
Если исполнитель был переопределен, возможно, указан один пул потоков или использовался Executors.newSingleThreadExecutor();
.
CompletableFuture:
Код CompletableFuture.runAsync{ new Runnable ()}
создаст экземпляр CompletableFuture
и выполнит код асинхронно (создаст поток) каждый раз, когда он вызывается.
CompletableFuture<Void> future
= CompletableFuture.runAsync(() -> "This is processed asynchronously");