Как лучше всего реализовать многопоточный подход в Spring BootJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Как лучше всего реализовать многопоточный подход в Spring Boot

Сообщение Anonymous »

Мне сложно реализовать многопоточный подход к приложению, над которым я работаю.
Та часть, которую я хочу запускать в параллельных потоках, изначально была построена с циклом for, обрабатывающим список.

Код: Выделить всё

@Service
public ApplicationServiceImpl implements ApplicationService {

@Override
public ResponseEntity startProcess(List myObjectList) throws Exception {
for (MyObject myObject : myObjectList) {
AnotherTypeOfObject anotherTypeOfObject = runMethodA(myObject);
YetAnotherTypeOfObject yetAnotherTypeOfObject = runMethodB(anotherTypeOfObject);
runMethodC(yetAnotherTypeOfObject, aStringValue, anotherStringValue);
runMethodD(yetAnotherTypeOfObject);
}
}
}
Методы Private AnotherTypeOfObject runMethodA(MyObject myObject) {..., Private YetAnotherTypeOfObject YetAnotherTypeOfObject(AnotherTypeOfObject AnotherTypeOfObject) {..., Private void runMethodC(YetAnotherTypeOfObject YetAnotherTypeOfObject, String aStringValue, StringotherStringValue) {... и Private void runMethodD(MyObject myObject) {... используют только локальные переменные.
Я довольно долго искал решение, которое позволило бы запускать потоки из списка из 100 объектов MyObject вместо одного за другим.
Что я сделал, так это создал:

Код: Выделить всё

@Configuration
@EnableAsync
public class AsyncConfiguration() {

@Bean(name = "threadPoolTaskExecutor")
public Executor aSyncExecutor() {
final ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
threadPoolTaskExecutor.setCorePoolSize(4);
threadPoolTaskExecutor.setMaxPoolSize(4);
threadPoolTaskExecutor.setQueueCapacity(50);
threadPoolTaskExecutor.setThreadNamePrefix("threadNamePrefix");
threadPoolTaskExecutor.initialize();
return threadPoolTaskExecutor;
}
}
У меня есть множество log.info("какой-то узнаваемый текст") через методы A, B, C и D, поэтому я могу убедиться, что происходит, и объединил эти методы в один, например

Код: Выделить всё

private void runThreads(MyObject myObject, String aStringValue, String anotherStringValue) {
AnotherTypeOfObject anotherTypeOfObject = runMethodA(myObject);
YetAnotherTypeOfObject yetAnotherTypeOfObject = runMethodB(anotherTypeOfObject);
runMethodC(yetAnotherTypeOfObject, aStringValue, anotherStringValue);
runMethodD(yetAnotherTypeOfObject);
}
И я попытался запустить основной метод как:

Код: Выделить всё

@Override
@Async("threadPoolTaskExecutor")
public ResponseEntity startProcess(List myObjectList) throws Exception {
String aStringValue = myObject.getAStringValue();
String anotherStringValue = myObject.getAnotherStringValue();
myObjectList.forEach(myObject -> runThreads(myObject, aStringValue, anotherStringValue));
}
Я по-прежнему не получаю желаемого результата от запуска нескольких потоков для метода runThreads(...) {, поэтому обработка выполняется параллельно.
Что мне здесь не хватает?>

Подробнее здесь: https://stackoverflow.com/questions/691 ... pring-boot
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»