JavaSpringAsync如何管理线程?
我想编写一个Spring引导应用程序,并考虑非阻塞请求。通常,我的控制器方法是单行方法,它只调用服务方法,然后返回,如下所示:JavaSpringAsync如何管理线程?,java,spring-boot,asynchronous,threadpool,Java,Spring Boot,Asynchronous,Threadpool,我想编写一个Spring引导应用程序,并考虑非阻塞请求。通常,我的控制器方法是单行方法,它只调用服务方法,然后返回,如下所示: @RestController class myController { ... @GetMapping("/") public String getString(){ return service.getString().get(); } } @Service class myService{ ...
@RestController
class myController {
...
@GetMapping("/")
public String getString(){
return service.getString().get();
}
}
@Service
class myService{
...
@Async
public CompleteableFuture<String> getString(){
return "Hello World!";
}
}
假设我有一个如下所示的服务实现:
@RestController
class myController {
...
@GetMapping("/")
public String getString(){
return service.getString().get();
}
}
@Service
class myService{
...
@Async
public CompleteableFuture<String> getString(){
return "Hello World!";
}
}
@服务
类myService{
...
@异步的
public completablefuture getString(){
返回“你好,世界!”;
}
}
(假设我在其他地方包括了@EnableAsync
,并假设控制器代码经过修改,通过提取字符串值并返回它来处理CompletableFutures)
当我的控制器调用我的服务时,Java是否仍保留一个工作线程来等待服务的返回值,还是将工作线程返回到线程池,直到服务完成其工作
谢谢
当我的控制器调用我的服务时,Java是否仍保留一个工作线程来等待服务的返回值
不,您的控制器没有等待,方法@Async
被异步调用
或者在服务完成其工作之前,工作线程是否返回到线程池
默认情况下,当调用
@Async
方法时,Spring使用SimpleAsyncTaskExecutor
为每次调用启动一个新线程,因此不使用线程池。但是,您可以提供自己的任务执行器,也可以使用ThreadPoolTaskExecutor
-。您可以在帖子中添加更多详细信息吗?用例是什么?它真的是这样工作的吗?因为它看起来很奇怪。若您想处理异步的东西,那个么为什么要等待异步方法的响应呢?您应该调用async方法并以正确的方式返回类似于200 202的内容,而无需等待async方法完成。您阅读了文档吗?如果你想要一个真正的异步架构,你应该使用像RxJava和ProjectReactor这样的库。@SergeiSirik代码看起来很奇怪,因为它只是一个示例。将提供的代码替换为有意义的代码。但是结构是一样的,因为文档没有回答这个问题。问题是,当调用CompleteableFuture.get()时,控制器正在使用的线程会发生什么情况?我认为这并不能回答问题。我知道异步方法的执行启动了一个新线程。我想知道的是,当调用方希望从服务中获取值时(例如,调用方调用CompleteableFuture.get()),如果未来未完成,它会阻止线程吗?是的,控制器会等待,因为控制器调用get()
,它会等待。@Ertai87是的,当您调用get()时
在未来
上,计算不可用,但呼叫将被阻止。