一、默认线程
当我们开发一个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的设置,可以在配置文件中对其进行更改。
- server.tomcat.accept-count:等待队列长度,当可分配的线程数全部用完之后,后续的请求将进入等待队列等待,等待队列满后则拒绝处理,默认100。
- server.tomcat.max-connections:最大可被连接数,默认10000
- server.tomcat.max-threads:最大工作线程数,默认200,
- server.tomcat.min-spare-threads:最小工作线程数,初始化分配线程数,默认10
-
默认配置下,连接超过10000后会出现拒绝连接情况
-
默认配置下,触发的请求超过200+100后拒绝处理(最大工作线程数+等待队列长度)
springboot内置的tomcat目前默认是基于NIO来实现的
SpringBoot内置Tomcat,在默认设置中,Tomcat的最大线程数是200,最大连接数是10000。支持的并发量是指连接数,200个线程如何处理10000条连接的?
目前Tomcat有三种处理连接的模式,一种是BIO,一个线程只处理一个连接,另一种就是NIO,一个线程处理多个连接。由于HTTP请求不会太耗时,而且多个连接一般不会同时来消息,所以一个线程处理多个连接没有太大问题。