Я пытаюсь понять поведение @Async в Spring Boot, используя по умолчанию SimpleAsyncTaskExecutor (где я не определяю явно какой-либо bean-компонент Executor).Согласно документации SimpleAsyncTaskExecutor, «по умолчанию количество одновременных потоков не ограничено».Но при запуске приведенного ниже примера кода все, что я вижу, это то, что только 8 потоков запущены, а оставшиеся задачи ждут, чтобы новый поток выполнил их.Я знаю, что это можно предотвратить с помощью пользовательского Executor, где я могу определить размер пула потоков.Но я хочу знать, является ли мое понимание SimpleAsyncTaskExecutor правильным или нет, или что-то не так с моим кодом.
Основной класс
@SpringBootApplication
@EnableAsync
public class MainRunner {
private static final Logger LOGGER = LoggerFactory.getLogger(MainRunner.class);
public static void main(String[] args) {
ApplicationContext applicationContext = SpringApplication.run(MainRunner.class);
MyService myService = (MyService) applicationContext.getBean("myService");
LOGGER.info("Starting the submission of tasks...");
for (int i = 1; i <= 50; i++) {
myService.doSomething("Number" + i);
}
LOGGER.info("Finished submission of tasks...");
}
}
Класс MyService
@Service
public class MyService {
private static final Logger LOGGER = LoggerFactory.getLogger(MyService.class);
@Async
public void doSomething(String userName) {
LOGGER.info(Thread.currentThread().getName() + ", "
+ Thread.currentThread().getId() + ", NAME: " + userName + " STARTING...");
for (int i = 0; i < 10000; i++) {
for (int j = 0; j < 1000000; j++) {
int res = i + j;
}
}
LOGGER.info(Thread.currentThread().getName() + ", "
+ Thread.currentThread().getId() + ", NAME: " + userName + " COMPLETE...");
}
}
Я ожидаю увидеть, что все 50 задач запущены, и они не ждут потока, готового их обработать.Но приведенный выше код приводит к тому, что первые 8 отправленных задач запускаются, а остальные ожидают завершения выполняемых задач, чтобы их можно было подобрать и выполнить.
2019-09-19 09:33:06.560 INFO 17376 --- [ main] sample.MainRunner : Starting the submission of tasks...
2019-09-19 09:33:06.564 INFO 17376 --- [ main] sample.MainRunner : Finished submission of tasks...
2019-09-19 09:33:06.566 INFO 17376 --- [ task-8] sample.MyService : task-8, 45, NAME: Number8 STARTING...
2019-09-19 09:33:06.566 INFO 17376 --- [ task-1] sample.MyService : task-1, 38, NAME: Number1 STARTING...
2019-09-19 09:33:06.566 INFO 17376 --- [ task-7] sample.MyService : task-7, 44, NAME: Number7 STARTING...
2019-09-19 09:33:06.567 INFO 17376 --- [ task-4] sample.MyService : task-4, 41, NAME: Number4 STARTING...
2019-09-19 09:33:06.566 INFO 17376 --- [ task-6] sample.MyService : task-6, 43, NAME: Number6 STARTING...
2019-09-19 09:33:06.567 INFO 17376 --- [ task-2] sample.MyService : task-2, 39, NAME: Number2 STARTING...
2019-09-19 09:33:06.567 INFO 17376 --- [ task-5] sample.MyService : task-5, 42, NAME: Number5 STARTING...
2019-09-19 09:33:06.567 INFO 17376 --- [ task-3] sample.MyService : task-3, 40, NAME: Number3 STARTING...
Он ожидает завершения первых 8, а затем выполняются оставшиеся задачи.Мое понимание SimpleAsyncTaskExecutor здесь неверно?