浅谈线程池

“什么是线程池?”

“呃……”

 

“为什么要使用线程池?”

“呃……”

 

“什么情况下使用线程池?”

“呃……”

 

这三个问题,说好回答挺容易,说难回答挺难。

 

“什么是线程池?”

“一组创建好的线程。”

 

“为什么要使用线程池?”

“提高CPU吞吐量,提升系统性能。”

 

“什么情况下使用线程池?”

“同时有多个请求或者多个任务需要处理,并且请求和任务会有block。”

 

当初这三个问题,问前辈的时候,前辈是这样告诉我的,没太听懂,感觉特牛逼,特玄乎,然后就不懂装懂了好长一段时间,后来想了想,这三个问题,前辈回答的还是不错的。

 

假设系统有1个CPU

 

假设你有两个Task需要处理,如果单线程处理,task2需要等待task1结束之后才能开始处理,如果task1有50%的时间处于block状态,那CPU就有50%的空闲时间被浪费掉了。

 

假设你有两个Task需要处理,如果有两个线程,当task1被block的时候,task2就可以独占CPU,这样就可以提高两个task的执行效率。

 

这样的话,如果再来一个任务,我们就再创建一个新的线程,去处理新来的任务,总之看上去好像是线程越多,CPU的利用率就越高,好像会处理的越来越快的样子。

 

但是事情恰恰相反,当线程数到达某个数值之后,你会发现,随着新线程的加入,系统对单一任务的响应时间越来越长,越来越慢,而且如果再继续增多的话,貌似内存要溢出了~而且响应时间也变成了无限长,直到任何一个任务都无法被完成。

 

那此时我们可能就会抛出一个解决方案:设定一个thread数的最大值不就好了,对,很对,问题得到了很好的解决,当有一个新的任务到来之后,我们就创建一个新的线程去处理它,直到活跃的线程数达到最大值之后,如果再有新的任务到来,那就让它排队等待好了,等之前的某个线程处理结束之后,再创建一个新的线程来处理排队的task,嗯,看上去已经完美了。

 

但是有一个问题被忽视了,创建和销毁线程是需要代价的!创建一个新的线程的时间大概需要消耗系统几百毫秒的时间,看着挺短,呃,其实挺长的~另外还需要消耗内存等其他资源,总之就是反复的创建和销毁线程是不好的,这个时候我们就又想出了一个解决方案:如果我们创建好固定数量的线程,不去销毁它,而是来了任务之后反复的利用,没有任务的时候就休息着先,而不是让它挂掉,这样问题不就解决了吗,嗯,很好,于是线程池就产生了,这就是线程池,上面的步骤也解释了为什么要使用线程池,和什么时候使用线程池。

 

Mark...

### Spring Boot框架简介与使用方法 Spring Boot 是由 Pivotal 团队提供的一个开源框架,旨在简化基于 Spring 框架的项目开发过程。它遵循“约定大于配置”的设计原则,减少了开发者在配置上的工作量[^2]。通过内置的默认配置和自动化配置机制,Spring Boot 提供了快速构建独立、生产级别的 Spring 应用程序的能力。 #### 1. Spring Boot 的核心概念 Spring Boot 的核心理念是减少开发者的负担,提供开箱即用的功能。以下是 Spring Boot 的几个关键特性: - **自动化配置**:Spring Boot 根据类路径中的依赖项自动配置 Spring 应用程序。例如,当引入数据库驱动依赖时,Spring Boot 会自动配置数据源和相关的 Bean 对象[^2]。 - **嵌入式服务器**:Spring Boot 内置了 Tomcat、Jetty 或 Undertow 等 Web 容器,使得应用程序可以独立运行而无需外部部署环境。 - **起步依赖(Starters)**:Spring Boot 提供了一系列的 Starter 模块,这些模块封装了常用的依赖和配置,方便开发者快速集成各种功能。例如,`spring-boot-starter-web` 提供了构建 Web 应用所需的所有依赖[^2]。 - **监控支持**:通过引入 `spring-boot-starter-actuator` 依赖,开发者可以获得丰富的监控指标,包括应用健康状态、线程池信息、内存使用情况等[^1]。 #### 2. Spring Boot 的执行流程 Spring Boot 的主要执行流程可以分为以下几个阶段: - **加载配置**:Spring Boot 从多个来源(如 `application.properties` 或 `application.yml` 文件)加载配置属性,并将其注入到应用程序中。 - **自动化配置**:根据类路径中的依赖项和配置属性,Spring Boot 自动配置 Spring 上下文。 - **启动嵌入式容器**:如果应用程序是一个 Web 应用,Spring Boot 将启动嵌入式 Web 容器。 - **运行应用程序**:完成上述步骤后,Spring Boot 启动应用程序并开始处理请求[^1]。 #### 3. 创建一个简单的 Spring Boot 项目 以下是创建和运行一个简单 Spring Boot 项目的步骤: 1. **添加依赖** 在 `pom.xml` 文件中添加 Spring Boot 的依赖项: ```xml <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.0.0</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> ``` 2. **编写主类** 创建一个包含 `@SpringBootApplication` 注解的 Java 类: ```java import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } } ``` 3. **创建控制器** 添加一个 REST 控制器来处理 HTTP 请求: ```java import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class HelloController { @GetMapping("/hello") public String sayHello() { return "Hello, Spring Boot!"; } } ``` 4. **运行项目** 使用以下命令运行项目: ```bash mvn spring-boot:run ``` 访问 `http://localhost:8080/hello` 即可看到输出结果。 #### 4. Spring Boot 的优势 Spring Boot 提供了诸多优点,使其成为现代 Java 开发的首选框架之一: - **快速集成**:通过 Starter 模块,开发者可以秒级集成各种框架[^2]。 - **减少配置**:完全抛弃繁琐的 XML 配置,采用注解和配置文件的方式进行开发[^2]。 - **内置监控**:通过 Actuator 模块,开发者可以获取丰富的监控指标[^1]。 - **易于扩展**:虽然 Spring Boot 本身是一个微框架,但它可以通过 Spring Cloud 等工具扩展以支持服务发现、注册、负载均衡等功能[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值