我想编写一个考虑到非阻塞请求的Spring Boot应用程序。通常,我的控制器方法是单行方法,它们仅调用服务方法然后返回,如下所示:
@RestController
class myController {
...
@GetMapping("/")
public String getString(){
return service.getString().get();
}
}
假设我有一个服务实现,看起来像这样:
@Service
class myService{
...
@Async
public CompleteableFuture<String> getString(){
return "Hello World!";
}
}
(假设我在其他地方包括@EnableAsync
,并假定已通过提取String值并将其返回来修改控制器代码以处理CompleteableFutures)
当我的控制器调用我的服务时,Java还是保留一个工作线程以等待该服务的返回值,还是该工作线程返回到线程池,直到服务完成其工作?
谢谢。
答案 0 :(得分:2)
当我的控制器调用我的服务时,Java是否仍保留一个工作线程来等待服务的返回值
否,您的控制器不等待,方法@Async
方法被异步调用。
还是工作线程返回到线程池,直到服务完成其工作?
默认情况下,调用@Async
方法时,Spring使用SimpleAsyncTaskExecutor
来为每次调用启动一个新线程,因此不使用线程池。但是,您可以提供自己的任务执行器,也可以使用ThreadPoolTaskExecutor
-details。