专业的JAVA编程教程与资源

网站首页 > java教程 正文

一个 tomcat 项目使用多个线程池还是一个线程池 ?

temp10 2025-05-30 17:25:29 java教程 11 ℃ 0 评论

在 Java 中,线程(Thread)是程序执行的最小单位。线程是指操作系统能够进行运算调度的最小单位,可以理解为操作系统所分配的一段可执行的代码,可以与其他线程并发执行,共享相同的进程空间和资源。

线程是指进程中的一个执行流程,一个进程中可以运行多个线程。

一个 tomcat 项目使用多个线程池还是一个线程池 ?

一般来说,所有的程序至少有一个线程,称为主线程,这个主线程是由 JVM 或 Java 虚拟机在程序执行时创建的。当主线程创建好之后,会调用 main() 方法来执行。

真正应用场景里,比如 springboot 项目里会有很多不同的线程池 。

从图中,我们看到 tomcat 容器内有不同的线程池,比如接收连接线程池,执行线程,业务自定义线程池等等。

试想一下,假如我们只有一种线程池,那么假设某种业务阻塞了,系统中所有的业务都会受影响

所以我们在设计系统时,原则要做到让各个线程池各司其职,才能让系统的资源调度更加合理

各司其职的特点是:线程池隔离,也就是指将不同任务分配给不同线程池来处理的方式。主要有如下两点方式:

  • 任务类型隔离
  • 将不同类型的任务分配给不同的线程池处理,例如将计算密集型任务分配给 CPU 密集型的线程池,将 IO 密集型任务分配给 IO 密集型的线程池。
  • 业务模块隔离
  • 将不同业务模块的任务分配给不同的线程池处理,例如将订单处理任务分配给订单处理线程池,将用户查询任务分配给用户查询线程池。

我们举知名的消息队列 RocketMQ 为例,它在处理网络请求中的线程池隔离做得非常漂亮:

RocketMQ 里 ,网络请求都会携带命令编码,每种命令映射对应的处理器,而处理器又会注册对应的线程池。

当服务端 Broker 接收到发送消息命令时,都会有单独的线程池 sendMessageExecutor 来处理这种命令请求。

基于 ThreadPoolExecutor 做了一个简单的封装 ,
BrokerFixedThreadPoolExecutor 构造函数包含六个核心参数:

  1. 核心线程数和最大线程数相同 ,数量是:cpu核数和4比较后的最小值;
  2. 空闲线程的回收的时间限制,默认1分钟;
  3. 发送消息队列,有界队列,默认10000;
  4. 线程工厂 ThreadFactoryImpl ,定义了线程名前缀:SendMessageThread_ 。

RocketMQ 实现了一个简单的线程工厂:ThreadFactoryImpl,线程工厂可以定义线程名称,以及是否是守护线程 。


本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表