Как Java Spring Async управляет потоками? - PullRequest
0 голосов
/ 05 января 2019

Я хочу написать приложение Spring Boot с учетом неблокирующих запросов. В общем, мои методы контроллера - это однострочные методы, которые просто вызывают метод службы, а затем возвращают, например:

@RestController
class myController {
    ...
    @GetMapping("/")
    public String getString(){
        return service.getString().get();
    }
}

Допустим, у меня есть реализация Service, которая выглядит примерно так:

@Service
class myService{
    ...
    @Async
    public CompleteableFuture<String> getString(){
        return "Hello World!";
    }
}

(Предположим, что в другом месте я включил @EnableAsync, и предположим, что код контроллера изменен для обработки CompleteableFutures путем извлечения значения String и его возврата)

Когда мой контроллер вызывает мою службу, Java все еще резервирует рабочий поток для ожидания возвращаемого значения из Службы или рабочий поток возвращается в пул потоков, пока служба не завершит свою работу?

Спасибо.

1 Ответ

0 голосов
/ 05 января 2019

Когда мой контроллер вызывает мою службу, резервирует ли Java рабочий поток для ожидания возвращаемого значения из службы

Нет, ваш контроллер не ждет, метод @Async метод вызывается асинхронно.

или рабочий поток возвращается в пул потоков, пока служба не завершит свою работу?

По умолчанию, когда вызывается метод @Async, Spring использует SimpleAsyncTaskExecutor, который запускает новый поток для каждого вызова, поэтому пул потоков не используется. Однако вы можете предоставить своего собственного исполнителя задач или использовать ThreadPoolTaskExecutor - details .

...