Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaSpringAsync如何管理线程?_Java_Spring Boot_Asynchronous_Threadpool - Fatal编程技术网

JavaSpringAsync如何管理线程?

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{ ...

我想编写一个Spring引导应用程序,并考虑非阻塞请求。通常,我的控制器方法是单行方法,它只调用服务方法,然后返回,如下所示:

@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()时
未来
上,计算不可用,但呼叫将被阻止。