用threadpoolexecutor实现简易web服务器:主线程用serversocket监听端口并accept连接,立即提交socket给线程池;任务类解析http请求(提取方法、路径)、生成响应(含状态行、头、空行、体),写回后关闭socket;线程池配置推荐核心数=cpu核数、最大数=核心×2、队列用linkedblockingqueue、拒绝策略用callerrunspolicy。

用 ThreadPoolExecutor 实现简易 Web 服务器,核心是:接收 TCP 连接、解析 HTTP 请求、生成响应、交由线程池处理——不依赖 Tomcat 或 Netty,纯 JDK 即可跑起来。
监听端口并接受连接
用 ServerSocket 绑定端口(如 8080),在循环中调用 accept() 阻塞等待客户端连接。每个新连接是一个 Socket 实例,不能直接在主线程里处理,否则会阻塞后续连接。
建议做法:
- 主线程只负责
accept(),拿到Socket后立即提交给线程池 - 避免在
accept()循环里做 I/O 解析或业务逻辑 - 加上基础异常捕获(如
IOException)防止服务意外退出
定义任务类处理单个请求
创建一个实现 Runnable 的内部类或独立类,构造时传入 Socket,在 run() 中完成读请求、写响应全过程:
- 用
BufferedReader读取请求行和请求头(注意 HTTP/1.1 的换行符是\r\n) - 简单判断路径(如
/返回 HTML,/time返回当前时间) - 用
PrintWriter写响应:状态行 + 头部 + 空行 + 响应体 - 务必在最后调用
socket.close(),否则连接不释放
示例响应头:HTTP/1.1 200 OK\r\nContent-Type: text/html; charset=utf-8\r\n\r\n
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
配置合适的 ThreadPoolExecutor
不是越大越好,要兼顾并发数与系统资源:
-
核心线程数:设为 CPU 核心数(
Runtime.getRuntime().availableProcessors())较稳妥 - 最大线程数:可略高(如核心数 × 2),防突发请求堆积
-
队列类型:用
LinkedBlockingQueue(无界)或带容量的ArrayBlockingQueue;慎用SynchronousQueue,容易因拒绝策略中断请求 -
拒绝策略:推荐
CallerRunsPolicy,让主线程临时顶替执行,比直接丢弃更友好
基础 HTTP 解析只需关注关键字段
简易服务器不必实现完整 HTTP/1.1,重点提取:
- 请求方法(
GET或HEAD即可) - 请求路径(第一行形如
GET /hello HTTP/1.1,空格分隔后取第二项) - 忽略请求体(GET 无 body)、Cookie、编码等复杂字段
- 对非支持路径统一返回
404 Not Found
注意:读取时用 readLine() 要处理超时(socket.setSoTimeout(5000)),避免线程卡死。
不复杂但容易忽略:记得关闭流和 socket,设置超时,用好拒绝策略——跑通后你就能 curl 测试,看到 “Hello from ThreadPoolExecutor” 了。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










