一、默认线程

当我们开发一个SpringBoot的项目,我们并未设置任何和线程相关的操作,但是我们的程序还是可以并行执行多个接口请求。甚至说绝大多数的项目,我们不需要对线程这块做任何操作。这是为什么呢?

测试默认线程池

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestController {

    @GetMapping("/test")
    public String fun(){
        System.out.println(Thread.currentThread().getName());
        return "success";
    }
}

打印结果如下:我请求了14次

http-nio-8888-exec-1
http-nio-8888-exec-2
http-nio-8888-exec-3
http-nio-8888-exec-4
http-nio-8888-exec-5
http-nio-8888-exec-8
http-nio-8888-exec-7
http-nio-8888-exec-6
http-nio-8888-exec-9
http-nio-8888-exec-10
http-nio-8888-exec-1
http-nio-8888-exec-2
http-nio-8888-exec-3
http-nio-8888-exec-4
————————————————

可以看到它默认是用多个线程去执行我们的接口任务的。

二、默认内嵌Tomcat配置

Spring Boot 能支持的最大并发量主要看其对Tomcat的设置,可以在配置文件中对其进行更改。

  1. server.tomcat.accept-count:等待队列长度,当可分配的线程数全部用完之后,后续的请求将进入等待队列等待,等待队列满后则拒绝处理,默认100。
  2. server.tomcat.max-connections:最大可被连接数,默认10000
  3. server.tomcat.max-threads:最大工作线程数,默认200,
  4. server.tomcat.min-spare-threads:最小工作线程数,初始化分配线程数,默认10
  • 默认配置下,连接超过10000后会出现拒绝连接情况

  • 默认配置下,触发的请求超过200+100后拒绝处理(最大工作线程数+等待队列长度)

springboot内置的tomcat目前默认是基于NIO来实现的

SpringBoot内置Tomcat,在默认设置中,Tomcat的最大线程数是200,最大连接数是10000。支持的并发量是指连接数,200个线程如何处理10000条连接的?

目前Tomcat有三种处理连接的模式,一种是BIO,一个线程只处理一个连接,另一种就是NIO,一个线程处理多个连接。由于HTTP请求不会太耗时,而且多个连接一般不会同时来消息,所以一个线程处理多个连接没有太大问题。