点击查看代码
public class DiyTomcat {

    private int port = 8080;

    public static final HashMap<String, DiyServlet> SERVLET_MAPPING = new HashMap<>();

    public static final HashMap<String,String> URL_MAPPING = new HashMap<>();

    private static ThreadPoolExecutor threadPoolExecutor;

    static {
loadServlet();
initExecutors();
} // 线程池化
private static void initExecutors() {
int corePoolSize = 10;
int maximumPoolSize = 50;
long keepAliveTime = 100L;
TimeUnit unit = TimeUnit.SECONDS;
BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<>(50);
ThreadFactory threadFactory = Executors.defaultThreadFactory();
RejectedExecutionHandler handler = new ThreadPoolExecutor.AbortPolicy();
threadPoolExecutor = new ThreadPoolExecutor(
corePoolSize,
maximumPoolSize,
keepAliveTime,
unit,
workQueue,
threadFactory,
handler
);
} private static void loadServlet() {
try {
//获取web.xml目录地址
String path = DiyTomcat.class.getResource("/").getPath();
SAXReader reader = new SAXReader();
//读取web.xml文件
Document document = reader.read(new File(path + "web.xml"));
//获取根标签(servlet和servlet-mapping),放在一个List中
Element rootElement = document.getRootElement();
List<Element> elements = rootElement.elements();
//循环将映射写进map映射里
for(Element element : elements){
if ("servlet".equalsIgnoreCase(element.getName())){
Element servletName = element.element("servlet-name");
Element servletClass = element.element("servlet-class");
//需要注意的是servletMapping映射的第二个参数,要通过反射的方式进行实例化
SERVLET_MAPPING.put(servletName.getText(),
(DiyServlet) Class.forName(servletClass.getText().trim()).newInstance());
}else if ("servlet-mapping".equalsIgnoreCase(element.getName())){
Element servletName = element.element("servlet-name");
Element urlPattern = element.element("url-pattern");
URL_MAPPING.put(urlPattern.getText(), servletName.getText());
}
}
} catch (DocumentException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
}
} public void start() throws IOException {
ServerSocket serverSocket = new ServerSocket(port);
while (true) {
Socket socket = serverSocket.accept();
RequestHandler requestHandler = new RequestHandler(socket);
// 一个 socket 一个线程
// new Thread(requestHandler).start();
// 使用线程组干活
threadPoolExecutor.execute(requestHandler);
}
}
}
  1. 通过initExecutors方法创建出一个线程池
    private static void initExecutors() {
// 核心线程数
int corePoolSize = 10;
// 最大线程数
int maximumPoolSize = 50;
// 空闲线程保活时间
long keepAliveTime = 100L;
// 保活单位,当前设置为秒
TimeUnit unit = TimeUnit.SECONDS;
// 线程池队列
BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<>(50);
// 线程创建工厂
ThreadFactory threadFactory = Executors.defaultThreadFactory();
// 池子满后的拒绝请求处理器
RejectedExecutionHandler handler = new ThreadPoolExecutor.AbortPolicy();
threadPoolExecutor = new ThreadPoolExecutor(
corePoolSize,
maximumPoolSize,
keepAliveTime,
unit,
workQueue,
threadFactory,
handler
);
}
  1. accept到socket后直接包装成RequestHandler交由线程池处理
while (true) {
Socket socket = serverSocket.accept();
RequestHandler requestHandler = new RequestHandler(socket);
// 一个 socket 一个线程
// new Thread(requestHandler).start();
// 使用线程组干活
threadPoolExecutor.execute(requestHandler);
}

代码地址:

https://github.com/ZhongJinHacker/diy-tomcat/tree/pool-tomcat

最新文章

  1. iOS版本更新的App提交审核发布流程
  2. Math
  3. Android图片复制
  4. MVC3/4 自定义HtmlHelper截断文本内容(截取)
  5. Oracle -&gt;&gt; ENABLE VALIDATE &amp; DISABLE VALIDATE
  6. iPad开发(相对于iPhone开发时专有的API)
  7. [Swust OJ 412]--医院设置(floyd算法)
  8. Android——与查询联系人相关的3张表
  9. js字符串转换为数字 总结
  10. Vue深度学习(1)
  11. hash类型
  12. [LeetCode] Implement Magic Dictionary 实现神奇字典
  13. Linux服务器断电导致挂载及xfs文件损坏的修复方法
  14. 三、临时弹出一个QQ对话窗口
  15. 解决ftp客户端连接验证报错Server sent passive reply with unroutable address. Using server address instead
  16. C++将数组的元素顺序随机打乱
  17. bzoj1345 序列问题
  18. C#全能数据库操作类及调用示例
  19. [Codeforces708E]Student&#39;s Camp
  20. Feign 使用入门

热门文章

  1. Java实用类(五) -Math类和指定范围的随机数
  2. c++(qt)播放wav文件的四种方式
  3. ASP.NET MVC之models_list传值view
  4. 叮,GitHub 到账 550 美元「GitHub 热点速览 v.22.26」
  5. VisionPro &#183; C# &#183; 界面显示视觉结果图像
  6. 贝壳自动化测试平台sosotest 学习记录
  7. 4种Kafka网络中断和网络分区场景分析
  8. 使用 spring-security-oauth2 体验 OAuth 2.0 的四种授权模式
  9. [原创]树莓派CM4配置GPIO复用为i2c
  10. RabbitMQ消费者消失与 java OOM