线程池技术

单纯多线程存在的问题

  • 每当有新连接到来时,服务端的主线程都会重新为该客户端创建为其提供服务的新线程,而当服务结束后又会将该新线程销毁。这样不仅麻烦,且效率低下,每当连接到来的时候服务端才创建对应提供服务的线程
  • 若有大量的客户端连接请求,此时服务端要为每一个客户端创建对应的服务线程。计算机中的线程越多,CPU的压力就越大,因为CPU要不断在这些线程之间来回切换,此时CPU在调度线程的时候,线程和线程之间切换的成本就会变得很高。此外,一旦线程太多,每一个线程再次被调度的周期就变长了,而线程是为客户端提供服务的,线程被调度的周期变长,客户端也体验也会变差

解决方案

  • 可以在服务端预先创建一批线程,当有客户端请求连接时就让这些线程为客户端提供服务,此时客户端一来就有线程为其提供服务,而不是当客户端来了才创建对应的服务线程
  • 当某个线程为客户端提供完服务后,不要让该线程退出,而是让该线程继续为下一个客户端提供服务,若当前没有客户端连接请求,则可以让该线程先进入休眠状态,当有客户端连接到来时再将该线程唤醒
  • 服务端创建的这一批线程的数量不能太多,CPU的压力也就不会太大。此外,若有客户端连接到来,但此时这一批线程都在给其他客户端提供服务,这时服务端不应该再创建线程,而应该让这个新来的连接请求在全连接队列进行排队,等服务端这一批线程中有空闲线程后,再将该连接请求获取上来并为其提供服务

引入线程池

要解决问题就需在服务端引入线程池,线程池的存在就是为了避免处理短时间任务时创建与销毁线程的代价,还能够保证内核充分利用,防止过分调度(调度周期过长)

在线程池中存在一个任务队列,当有新的任务到来的时候,就可以将任务Push到线程池中,在线程池中默认创建10个线程,这些线程不断检测任务队列中是否有任务,若有任务就取出任务,然后调用该任务对应的Run函数对该任务进行处理,若线程池中没有任务当前线程就会进入休眠状态。

相关推荐
GanGanGanGan_12 分钟前
RustDesk 安装指南 — Rocky Linux 9 + XFCE X11
linux·运维·centos
bzmK1DTbd1 小时前
Git版本控制:Java项目中的分支管理与合并策略
java·开发语言·git
Rust研习社1 小时前
为什么 Rust 没有空指针?
开发语言·后端·rust
kyriewen112 小时前
WebAssembly:前端界的“外挂”,让C++代码在浏览器里跑起来
开发语言·前端·javascript·c++·单元测试·ecmascript
其实防守也摸鱼4 小时前
CTF密码学综合教学指南--第九章
开发语言·网络·python·安全·网络安全·密码学·ctf
砚底藏山河4 小时前
Python量化开发:2026最佳实时股票数据API接口推荐与对比
开发语言·windows·python
南境十里·墨染春水4 小时前
linux学习笔记 网络编程——Socket入门与TCP客户端/服务器实现
linux·服务器·网络
AlunYegeer4 小时前
JAVA,以后端的视角理解前端。在全栈的路上迈出第一步。
java·开发语言·前端
hixiong1235 小时前
C# OpenvinoSharp使用DINOv2模型进行图像相似度计算
开发语言·c#
DFT计算杂谈5 小时前
自动化脚本一键绘制三元化合物相图
java·运维·服务器·开发语言·前端·python·自动化