网站首页 > 文章精选 正文
背景
因为最近给同事们灌输了尽量让接口里面的方法异步化,尽量使用线程池来处理任务。所以同事们都把自己写得比较耗时的方法(一般都是一个方法里面要多次与数据库交互)改造成多线程的方式,大大的缩减了接口的响应时间。分享一下相关知识,希望能帮到对线程池不太熟悉的同学。
线程池流程
流程图
为什么使用线程池
为了提高资源利用率,复用线程,减少线程的创建与销毁的开销。
有经验的开发者,线程池一般都会选择创建固定大小。更有经验的会自己手动设置线程池的相关参数。
1 核心线程数 2 最大线程数 3 线程池中空闲线程等待工作的超时时间 4 阻塞队列类型(有界或者无界)5 拒绝策略
关于线程池大小的设置:
工作中线程数量设置多少合适?(一般计算密集型线程池大小设置为CPU个数,IO密集型的任务线程池大小设置为CPU个数的2N+1)。 最好的方式是通过压力测试来实验。
任务过多的处理
任务超出了线程总数后怎么拒绝?
系统给出的四种策略:
1 直接丢弃(就像和女朋友没有告别的分手)
2 丢弃抛出异常(给女朋友分手找个理由,也是默认的拒绝策略)
? 3 丢弃最早的任务(喜新厌旧)
? 4 由调用线程(提交任务的线程)直接执行此任务
? 可能存在的风险:任务会交给上层线程(主线程)执行,导致上层线程既要处理其他任务,又要忙碌处理线程池的源源不断的任务,导致悬挂,进而导致线上故障。
? 自定义的拒绝策略:
将任务信息放入消息队列中 (不放弃任务一个任务)
核心线程会被回收吗
默认不会,如果设置成会的话,超过keepAliveTime后一样会像非核心线程一样被回收,但是这样就失去了线程池设计的初衷,即为了复用线程。
写在最后
即便使用池化技术,也只是提高了线程池内的线程利用率,但在高并发的业务场景中,池化技术一样会带来性能和资源开销的问题。如果我们使用消息组件来执行异步业务,则可以在性能和资源两者之间做一个很好的平衡.
- 上一篇: Java线程池的正确创建方式
- 下一篇: 一篇详解内核监控进程与线程创建
猜你喜欢
- 2025-01-02 Socket与TCP协议,利用python打造一个多人聊天室
- 2025-01-02 探讨C语言系统编程中线程的原理以及实现
- 2025-01-02 ffmpeg播放器实现详解 - 创建线程
- 2025-01-02 互联网面试-Java中如何去创建一个线程池?
- 2025-01-02 一篇详解内核监控进程与线程创建
- 2025-01-02 Python多线程,线程与进程的区别,线程模块及线程的两种创建方式
- 2025-01-02 Java线程池的正确创建方式
- 2025-01-02 [编程基础] C++多线程入门1-创建线程的三种不同方式
- 2025-01-02 Qt多线程创建
- 2025-01-02 腾讯二面:Linux操作系统里一个进程最多可以创建多少个线程?
- 最近发表
- 标签列表
-
- newcoder (56)
- 字符串的长度是指 (45)
- drawcontours()参数说明 (60)
- unsignedshortint (59)
- postman并发请求 (47)
- python列表删除 (50)
- 左程云什么水平 (56)
- 计算机网络的拓扑结构是指() (45)
- 稳压管的稳压区是工作在什么区 (45)
- 编程题 (64)
- postgresql默认端口 (66)
- 数据库的概念模型独立于 (48)
- 产生系统死锁的原因可能是由于 (51)
- 数据库中只存放视图的 (62)
- 在vi中退出不保存的命令是 (53)
- 哪个命令可以将普通用户转换成超级用户 (49)
- noscript标签的作用 (48)
- 联合利华网申 (49)
- swagger和postman (46)
- 结构化程序设计主要强调 (53)
- 172.1 (57)
- apipostwebsocket (47)
- 唯品会后台 (61)
- 简历助手 (56)
- offshow (61)