线程管理/ spring的工作@Async

时间:2017-05-30 13:23:15

标签: java spring parallel-processing thread-safety spring-async

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

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

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

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

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

底线 - 有人可以向我解释@Async代码

的工作/线程管理

使用图片更新以获得更好的解释:

enter image description here

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。

1 个答案:

答案 0 :(得分:1)

例如,我们从Spring's tutorial

采取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返回给来电者。
  4. ThreadPool是在程序开头创建的,代理从中获取线程来运行代码。

    The implementation位于AsyncExecutionInterceptor类,invoke方法。