Java Spring Async如何管理线程?

时间:2019-01-04 22:36:56

标签: java spring-boot asynchronous threadpool

我想编写一个考虑到非阻塞请求的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还是保留一个工作线程以等待该服务的返回值,还是该工作线程返回到线程池,直到服务完成其工作?

谢谢。

1 个答案:

答案 0 :(得分:2)

  

当我的控制器调用我的服务时,Java是否仍保留一个工作线程来等待服务的返回值

否,您的控制器不等待,方法@Async方法被异步调用。

  

还是工作线程返回到线程池,直到服务完成其工作?

默认情况下,调用@Async方法时,Spring使用SimpleAsyncTaskExecutor来为每次调用启动一个新线程,因此不使用线程池。但是,您可以提供自己的任务执行器,也可以使用ThreadPoolTaskExecutor-details