1

@Async在我的代码中使用从 Rest 控制器到 3 个不同方法的 3 个并行调用。

根据我对servlet的理解(这可能是错误的),当spring@RestController方法接收到请求时,会为其创建一个线程,此后对于每个新请求都会创建一个新线程。

请求线程 1 - 创建了 3 个异步线程
请求线程 2 - 创建了 3 个异步线程

现在 spring/Request 线程如何知道哪 3 个异步线程属于哪个线程,即请求线程 1 或请求线程 2。

可能有某种映射告诉他们。
我尝试@Async在线搜索,但很少有关于其工作的文档。谷歌充斥着如何使用代码但无法正常运行。

@Async底线 - 有人可以解释一下代码的工作/线程管理吗


更新图像以获得更好的解释:

在此处输入图像描述

1) 请求 1 进来并产生 3 个线程(A1、A2 和 A3),因为它是一个带有响应 R1、R2 和 R3 的异步调用。
2)请求2进来并做同样的事情,即请求:A4,A5和A6,响应为R1,R2和R3 ..
3)现在我的问题是R1,R2和R3如何意识到它们是相同的请求,即请求 1。如果它是一个顺序调用,那么同一个线程将从开始传播到结束。但是在创建 6 个异步请求之后,我只能在线程转储中看到 6 个线程,并且没有线程作为请求 1 或请求 2。
那么在 R1、R2 和 R3 完成时,请求 1 如何完成,但在 R1 完成时没有, R2 和 R6请求 1 从 R1 、 R2 和 R3 完成的记录是谁和在哪里保存的。

4

1 回答 1

1

例如,让我们采用Spring 教程findUser中的方法

@Async
public CompletableFuture<User> findUser(String user) throws InterruptedException {
    logger.info("Looking up " + user);
    String url = String.format("https://api.github.com/users/%s", user);
    User results = restTemplate.getForObject(url, User.class);
    // Artificial delay of 1s for demonstration purposes
    Thread.sleep(1000L);
    return CompletableFuture.completedFuture(results);
}

假设您正在使用@EnableAsync,每次调用findUser实际上都会调用一个代理:

  1. 创建一个CompletableFuture实例。
  2. 在不同的线程中执行findUser,传递相同的CompletableFuture实例。
    • 执行完成后,它会更新共享CompletableFuture实例。
  3. 返回CompletableFuture给调用者。

ThreadPool 在您的程序开始时创建,代理从中获取线程来运行您的代码。


实现AsyncExecutionInterceptor类, invoke方法中。

于 2017-06-18T15:30:52.283 回答