Я думаю, что вы смешиваете вещи: TaskExecutor/Executor
конфигурация и кратность задач, выполняемых планировщиком.
Эта конфигурация означает, что задача будет выполняться каждые 3 секунды:
@Scheduled(fixedRate = 3000, ...)
Добавление: @Async("threadBarExecutor")
просто означает, что планировщик будет использовать определенный Executor
для запуска задач,
Это не означает, что оно будет выполнено столько, сколько не будет заполнен размер пула потоков в сконфигурированном Executor
.
Так что да, выглядит нормально, что эти две задачи запускаются каждые 3 секунды,
Если вы хотите запускать эти задачи определенное количество раз параллельно и каждые 3 секунды, @Scheduled
недостаточно.
Вы должны сделать метод планировщика для вызова другого @Asynch
метода.Это может быть определено в одном и том же компоненте или в другом, не имеет значения.
@Async("threadFooExecutor")
@Scheduled(fixedRate = 3000, initialDelay = 5000)
public void printRepeat3Times() {
for (int i=0; i<3; i++){
print();
}
}
@Async("threadFooExecutor")
public void print() {
// ...
}
Обратите внимание, что, поскольку эти методы аннотированы с @Asynch
, print()
вызовы не «блокируют» текущий поток, и поэтому они могут выполняться параллельно благодаря ExecutorService
подкапюшоны.