Issue
I have this two snippets in a Spring WebMVC controller:
First: thenApplyAsync
@RequestMapping(value = {"/index-standard"}, method = RequestMethod.GET)
public CompletableFuture<String> indexStandard(Model model) {
return projectService
.findMine(getCurrentApplicationUser())
.thenApplyAsync((result) -> {
model.addAttribute("projects", result);
return "/projectmanagement/my/index";
});
}
Second: join()
@RequestMapping(value = {"/index-nonstandard"}, method = RequestMethod.GET)
public String indexNonStandard(Model model) {
CompletableFuture<Iterable<ProjectDto>> mine = projectService.findMine(getCurrentApplicationUser());
CompletableFuture.allOf(mine).join();
model.addAttribute("projects", mine.join());
return "/projectmanagement/my/index";
}
For my understanding:
First option:
join()
waits for execution of theCompletableFuture
code.- the code is executed on a dedicated thread.
- the http thread from the origin http request is available for further requests while the code executes
- at the end (when the code is finished) the view will be rendered
Second option:
- the same as the first option?
What is the difference in these options?
So is there a preferable solution (first or second)?
Both options work.
Solution
.join()
will block the execution of the thread and wait until the result is ready. Usually, that's not the behaviour one wants when writing async applications.
Answered By - Davide D'Alto
Answer Checked By - Pedro (JavaFixing Volunteer)