【问题标题】:How Spring Boot Async method handles request using ThreadPoolSpring Boot Async 方法如何使用 ThreadPool 处理请求
【发布时间】:2020-09-10 01:32:55
【问题描述】:

我无法理解异步是如何工作的。我知道网络服务器有自己的线程池来处理多个请求。当我们使用 Spring Boot 实现异步 Web 服务并使用 TaskExecutor 配置 "n" 个线程时,这是否意味着为每个线程创建 n 个线程应要求而来?

为了澄清,服务器将从其 ThreadPool 中将请求分配给一个线程。所以当这个线程开始执行并调用一个标记为 @Asynch 的函数时,它可以为每个传入线程创建另一个 "n" 个线程来处理异步工作。请让我知道我的理解是否正确。

如果我的理解是正确的,那么如何决定应该创建多少池大小?谁能举个例子。

【问题讨论】:

    标签: java multithreading spring-boot asynchronous


    【解决方案1】:

    有两件事,一个是一个 tomcat 线程池,每个请求都从其中获取一个线程并正在处理(这在 server.tomcat.max-threads 中配置)和一个用于运行 @Aync 的单独线程池任务。当您运行注释为异步的方法(实际上是任务)时,这将创建一个任务并在异步队列中等待。初始请求不会被阻止,如果您不等待异步完成将返回并继续执行他的工作。简单来说,用@Async注解一个方法会使其在单独的线程中执行,调用者不会等待完成。

    【讨论】:

    • 感谢您的回答消除了我的大部分疑虑。我无法得到的一件事是假设有 200 个不同的传入请求访问 @async 方法,我们应该创建一个大小为 200 的线程池?
    • @AbhishekDash 没有必要,如果异步任务较轻,那么原始请求可能不是。如果你有很重的东西并且你不断地添加到异步队列中,那么你可能需要更多的线程。如果这些异步任务很繁重,那么您最好选择被动式。
    • 感谢您的解释
    猜你喜欢
    • 1970-01-01
    • 2019-06-20
    • 2016-01-24
    • 2016-10-31
    • 2019-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-03
    相关资源
    最近更新 更多