Я пытаюсь сделать некоторые вычисления, используя несколько потоков. Я перебрал много статей, касающихся потоков и SpringBoot, но я нашел только два решения: @ EnableAsyn c и использование TaskExecutor. Никто из них не упомянул ExecutorService. Я создал следующий пример, который работает:
@RestController
@RequestMapping("/")
public class Controller {
private final ComputingService service;
Controller(ComputingService service) {
this.service = service;
}
@GetMapping
public ResponseEntity<BigDecimal> computeNumber() {
return ResponseEntity.ok(service.compute());
}
}
@Service
public class ComputingService {
private final ExecutorService executor;
private final NumberRepository repository;
public ComputingService(NumberRepository repository) {
this.repository = repository;
this.executor = Executors.newFixedThreadPool(6);
}
public BigDecimal compute() {
Future<BigDecimal> numberA = executor.submit(() -> repository.findA());
Future<BigDecimal> numberB = executor.submit(() -> repository.findB());
try {
BigDecimal a = numberA.get();
BigDecimal b = numberB.get();
return a.add(b);
}catch (InterruptedException e) {
Thread.currentThread().interrupt();
throw new RuntimeException(e);
}catch (ExecutionException e) {
throw new RuntimeException(e));
}
}
}
Есть ли подводные камни в таком решении? Должен ли исполнитель быть выключен когда-нибудь? Есть ли разница с таким использованием по сравнению с использованием Spring Task TaskExecutor и ExecutorServiceAdapter по сравнению с методами @ EnableAsyn c и @ Syn c?