自己动手写一个tomcat之3池化processor
写在前面源码 。本文来池化processor以提高服务处理性能。同时也会将processor改造为线程异步执行这样可以不用阻塞连接器connector的执行过程进一步提高程序性能。1正文首先将processor改造为线程也很简单只需要实现java.lang.Runnable接口即可,具体改造如下packagemonitomcat.server;// ...publicclassHttpProcessorimplementsRunnable{Socketsocket;booleanavailablefalse;// 维护连接器对象池化使用HttpConnectorconnector;// ...Overridepublicvoidrun(){while(true){// Wait for the next socket to be assignedSocketsocketawait();if(socketnull)continue;// Process the request from this socketprocess(socket);// Finish up this request处理完毕归还处理器到dequeue中以备下次使用connector.recycle(this);}}publicvoidstart(){ThreadthreadnewThread(this);thread.start();}publicvoidprocess(Socketsocket){try{Thread.sleep(3000);}catch(InterruptedExceptione1){e1.printStackTrace();}InputStreaminputnull;OutputStreamoutputnull;try{// ...// Close the socket业务处理完毕关闭套接字socket.close();}catch(Exceptione){e.printStackTrace();}}synchronizedvoidassign(Socketsocket){System.out.println(HttpProcessor.assign...);// wait for the connector to provide a new Socketwhile(available){try{wait();}catch(InterruptedExceptione){}}// Store the newly available Socket and notify our threadthis.socketsocket;availabletrue;notifyAll();}privatesynchronizedSocketawait(){System.out.println(HttpProcessor.await...);// Wait for the Connector to provide a new Socketwhile(!available){try{wait();}catch(InterruptedExceptione){}}// Notify the Connector that we have received this SocketSocketsocketthis.socket;availablefalse;// notifyAll();return(socket);}}run方法阻塞在await()方法上等待socket进来。assign(Socket socket)方法用来分派socket将会唤醒阻塞在await方法上的processor异步线程执行业务处理具体看下连接器connector是如何池化以及启动processor线程分派任务的packagemonitomcat.server;importjava.io.IOException;importjava.net.InetAddress;importjava.net.ServerSocket;importjava.net.Socket;importjava.util.ArrayDeque;importjava.util.Deque;publicclassHttpConnectorimplementsRunnable{intminProcessors3;intmaxProcessors10;// int minProcessors 1;// int maxProcessors 1;intcurProcessors0;DequeHttpProcessorprocessorsnewArrayDeque();publicvoidrun(){ServerSocketserverSocketnull;intport8080;try{serverSocketnewServerSocket(port,1,InetAddress.getByName(127.0.0.1));}catch(IOExceptione){e.printStackTrace();System.exit(1);}// initialize processors poolfor(inti0;iminProcessors;i){HttpProcessorinitprocessornewHttpProcessor(this);initprocessor.start();processors.push(initprocessor);}curProcessorsminProcessors;while(true){Socketsocketnull;try{socketserverSocket.accept();HttpProcessorprocessorcreateProcessor();if(processornull){socket.close();continue;}processor.assign(socket);// Close the socket// socket.close();}catch(Exceptione){e.printStackTrace();}}}publicvoidstart(){ThreadthreadnewThread(this);thread.start();}privateHttpProcessorcreateProcessor(){synchronized(processors){if(processors.size()0){// removes and returns the first element of this dequereturn((HttpProcessor)processors.pop());}if(curProcessorsmaxProcessors){return(((newProcessor())));}else{return(null);}}}privateHttpProcessornewProcessor(){HttpProcessorinitprocessornewHttpProcessor(this);initprocessor.start();processors.push(initprocessor);curProcessors;return((HttpProcessor)processors.pop());}voidrecycle(HttpProcessorprocessor){processors.push(processor);}}代码比较简单,看下即可这里说下processor线程池设置了最小值和最大值初始化时只初始最小值当不够用时直接new直到达到最大值这和jdk的线程池方案是不同的jdk的线程池方案时考虑到了线程创建成本高以及很快就会有可用线程两方面而将任务暂存到任务队列中只有在任务队列满时才会创建新的线程但是这种方案并不适合tomcat的场景因为暂存到任务队列的动作会降低程序执行的效率。这里要实现的是尽快执行每一个用户请求。启动服务所有的processor都会stand by准备处理socketConnected to the target VM, address: 127.0.0.1:53308, transport: socket HttpProcessor.await... HttpProcessor.await... HttpProcessor.await...如果有一个请求的话就会从processor池中取出一个并分配当前请求的socket给其处理并且处理完毕后继续进入下一个stand by2标准化request和response按照servlet规范request和response要实现javax.servlet.http.HttpServletRequest接口和javax.servlet.http.HttpServletResponse,如下定义HttpRequest类和HttpResponse类publicclassHttpRequestimplementsHttpServletRequest{}publicclassHttpResponseimplementsHttpServletResponse{}没有流程上的改变具体看代码吧源码 。写在后面参考文章列表手把手带你写一个 MiniTomcat 。

相关新闻

Prometheus+Grafana监控系统从零部署与实战配置指南

Prometheus+Grafana监控系统从零部署与实战配置指南

1. 项目概述:为什么选择PrometheusGrafana这套监控组合?在运维和开发领域,监控是保障系统稳定性的“眼睛”。当你的应用从单机走向集群,从几个服务膨胀到几十上百个微服务时,传统的日志查看和简单脚本监控就彻底不够用…

2026/9/21 2:56:48 阅读更多 →
Windows右键菜单管理:从注册表原理到RightMenuMgr实战清理

Windows右键菜单管理:从注册表原理到RightMenuMgr实战清理

1. 项目概述:为什么我们需要管理右键菜单 如果你在Windows系统上工作或娱乐超过一年,你的右键菜单大概率已经“臃肿不堪”。随便在桌面或文件夹空白处点一下右键,弹出的菜单可能长得需要滚动鼠标滚轮才能看到底。这些新增的条目,有…

2026/9/25 6:11:10 阅读更多 →
BarTender Cloud版本区别

BarTender Cloud版本区别

BarTender Cloud无需额外的IT基础设施和资源,即可随处创建、管理和打印标签。提供三种方案供选择。为什么选择云端版:快速部署标签解决方案自动接收最新功能与安全更新从多个位置远程打印标签借助简单、原生的云端集成降低管理成本基础版1、使用云端设计…

2026/9/28 17:30:59 阅读更多 →

最新新闻

毕设工具怎么选?横向对比后,我最终选择 Okbiye

毕设工具怎么选?横向对比后,我最终选择 Okbiye

前言 临近毕业季,大量同学开始疯狂寻找各类 AI 论文辅助工具。网上工具五花八门,单点翻译、独立绘图、AI 写作、查重网站层出不穷。很多人踩坑之后才发现,单一工具只能解决某一个小问题,想要走完完整毕设流程,需要同时…

2026/10/1 21:05:07 阅读更多 →
六西格玛考试科目全解析:绿带黑带题型分值与考点权重(2026报考季)

六西格玛考试科目全解析:绿带黑带题型分值与考点权重(2026报考季)

内容提要:中质协六西格玛考试按等级统考,不分科目——绿带80题(满分100分,60分及格)、黑带90题(满分120分,80分及格,另需项目答辩),考试内容围绕DMAIC方法论展…

2026/10/1 21:05:07 阅读更多 →
苏州做GEO营销的有经验的外贸服务商有啥:口碑公司汇总与选择指南

苏州做GEO营销的有经验的外贸服务商有啥:口碑公司汇总与选择指南

先搞懂:GEO营销到底是什么,外贸企业为什么绕不开GEO,全称生成式引擎优化,简单说就是让品牌在AI的回答里被看见、被引用、被推荐。过去海外买家找供应商的路径很清晰:在Google输入关键词,打开前十的网页&…

2026/10/1 21:05:07 阅读更多 →
国产之光 GP232RL USB转串口芯片完全兼容替代FT232RL

国产之光 GP232RL USB转串口芯片完全兼容替代FT232RL

GP232RL是最新加入 ftdi 系列 usb 接口集成电路设备的设备。232r是一个 usb 到串行 uart 接口,带有可选的时钟发生器输出,以及新的 ftdichip-idTM 安全加密器特性。此外,还提供了异步和同步位崩接口模式。通过将外部 eeprom、时钟电路和 usb …

2026/10/1 21:05:07 阅读更多 →
ThingsBoard Edge Ubuntu 升级指南:基于 .deb 包的升级流程与实现原理

ThingsBoard Edge Ubuntu 升级指南:基于 .deb 包的升级流程与实现原理

物联网后端数据可视化消息队列 【免费下载链接】thingsboard All-in-one IoT Platform - Device management, data collection, processing and visualization. 项目地址: https://gitcode.com/GitHub_Trending/th/thingsboard 点击查看 免费下载 本篇技术指南围绕…

2026/10/1 21:04:06 阅读更多 →
Qt5.12 + MSVC2017 环境搭建:我重装了三次才顺,这 8 个坑你不用再踩

Qt5.12 + MSVC2017 环境搭建:我重装了三次才顺,这 8 个坑你不用再踩

插件化那 20 天写的是"程序内部怎么长"。这个专栏换个角度——从一堆源码到一个能交给别人用的安装包,中间那些把人卡住的事。 开篇先解决最前面的一步:环境。去年我接手一个老项目,硬性要求 Qt 5.12.11 MSVC2017。照着网上的教程…

2026/10/1 21:04:06 阅读更多 →

日新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 0:00:30 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 0:00:30 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 1:01:17 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/10/1 19:40:48 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/10/1 19:41:40 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/10/1 20:05:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 0:00:30 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 0:00:30 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 1:01:17 阅读更多 →