【问题标题】:Spring boot web app acts like it's single-threadedSpring Boot Web 应用程序的行为就像它是单线程的
【发布时间】:2020-09-22 18:17:02
【问题描述】:

我正在本地测试一个 Spring Boot 控制器,我注意到一些让我感到惊讶的行为。我写了这个示例控制器方法:

@GetMapping()
public void test() throws InterruptedException {
    for(int i = 0; i < 5 ; i++) {
        Thread.sleep(1000);
        System.out.println(Thread.currentThread().getName() + " " + i);
    }
}

我几乎同时从不同的选项卡调用了端点两次。我期待看到来自两个线程的日志输出重叠(因为我认为每个请求都会创建一个新的执行线程)。同时,我得到的输出是:

http-nio-8080-exec-1 0
http-nio-8080-exec-1 1
http-nio-8080-exec-1 2
http-nio-8080-exec-1 3
http-nio-8080-exec-1 4
http-nio-8080-exec-1 0
http-nio-8080-exec-1 1
http-nio-8080-exec-1 2
http-nio-8080-exec-1 3
http-nio-8080-exec-1 4

这看起来只有一个线程,第二个请求实际上等待第一个完成。我认为tomcat默认的最大线程值为200。有人可以向我解释这种行为吗?为什么没有创建多个线程?

这是一个空白项目,由 Spring Initializer 创建,只有 Spring Boot Starter Web 作为依赖项

【问题讨论】:

    标签: java spring multithreading spring-boot


    【解决方案1】:

    在 Spring 中,每个请求都在单独的线程中执行。为了 例如,当 2 个用户要同时登录时,JVM 会创建 2 个 线程:第一个用户一个线程,第二个用户另一个线程。

    我试过你的情况,效果很好可能是你的请求不是那么并发,你可以使用curl

    curl  http://localhost:8080/hello/Logan & curl http://localhost:8080/hello/Leon
    

    【讨论】:

      猜你喜欢
      • 2022-10-23
      • 1970-01-01
      • 1970-01-01
      • 2018-05-08
      • 1970-01-01
      • 2018-01-18
      • 1970-01-01
      • 2017-12-26
      • 2020-03-12
      相关资源
      最近更新 更多