Spring @Асинхронное ограничение количества потоков

Мой вопрос очень похож на этот: @Async предотвращает продолжение потока до тех пор, пока не закончится другой поток

В основном мне нужно запустить ~ сотни вычислений в большем количестве потоков. Я хочу запустить только некоторое количество параллельных потоков, например. 5 потоков с 5 вычислениями в параллеле.

Я использую spring framework, а опция @Async - естественный выбор. Мне не нужна полнофункциональная JMS-очередь, для меня это немного накладные расходы.

Любые идеи? Спасибо вам

Ответ 1

Вы проверили Task Executor? Вы можете определить пул потоков с максимальным количеством потоков для выполнения ваших задач.

Если вы хотите использовать его с @Async, используйте его в spring -config:

<task:annotation-driven executor="myExecutor" scheduler="myScheduler"/>

<task:executor id="myExecutor" pool-size="5"/>

<task:scheduler id="myScheduler" pool-size="10"/>

Полная ссылка здесь (25.5.3). Надеюсь, это поможет.

Ответ 2

Если вы используете Spring Java-конфигурацию, ваш класс конфигурации должен реализовывать AsyncConfigurer:

@Configuration
@EnableAsync
public class AppConfig implements AsyncConfigurer {

    [...]

    @Override
    public Executor getAsyncExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(2);
        executor.setMaxPoolSize(5);
        executor.setQueueCapacity(50);
        executor.setThreadNamePrefix("MyExecutor-");
        executor.initialize();
        return executor;
    }
}

Подробнее см. документацию @EnableAsync: http://docs.spring.io/spring/docs/3.1.x/javadoc-api/org/springframework/scheduling/annotation/EnableAsync.html