gpt4 book ai didi

java - Spring 与 Callable 异步如何工作以及我不明白的地方?

转载 作者:太空宇宙 更新时间:2023-11-04 06:22:11 24 4
gpt4 key购买 nike

我正在阅读 SpringMVC 文档,但我陷入了异步部分:http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-ann-async

我使用这样的 Controller 创建了非常简单的项目(Spring 4,Java 8),如下所示:

@Controller
public class HomeController {

@RequestMapping("/async")
public Callable<String> async() {
logger.info("Async IN, {}", new Date());
return () -> {
Thread.sleep(5000);
return "home";
};
}

@RequestMapping("/sync")
public String sync() throws Exception {
logger.info("Sync IN, {}", new Date());
Thread.sleep(5000);
return "home";
}

}

我已经在 Servlet 中启用了异步功能 - 如文档中所述。现在我调用请求,首先调用 /sync,然后调用 /async。相继。他们都被立即 dispatch 。 Spring 应用程序不会等待 /sync 结束才开始处理 /async 请求。请求后我会在同一时间得到回复。

看起来像这样:

INFO : com.mydlarz.springtt.HomeController - Sync IN, Thu Dec 04 17:00:18 CET 2014
INFO : com.mydlarz.springtt.HomeController - Async IN, Thu Dec 04 17:00:19 CET 2014
INFO : com.mydlarz.springtt.HomeController - Async IN, Thu Dec 04 17:00:29 CET 2014
INFO : com.mydlarz.springtt.HomeController - Sync IN, Thu Dec 04 17:00:29 CET 2014

这是为什么呢?第二次请求处理不应在第一次同步后大约 5 秒开始?

最佳答案

同步和异步是针对 Servlet 容器使用的线程而言的。同步请求将耗尽该线程,并在需要完成其他操作时阻塞该线程。异步请求将耗尽线程,但不会阻塞它。操作将转移到另一个可能发生阻塞的线程。

Why is that? The second request handling should not be started about 5 sec after the first SYNC?

如果您的 Servlet 容器中有超过 4 个线程(很可能),则您的 4 个请求都不会等待其他请求。

关于java - Spring 与 Callable 异步如何工作以及我不明白的地方?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27298640/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com