背景
项目中的cpu使用率往往不高,使用多线程可以迅速提高cpu利用率,迅速提高任务处理效率。
例子
任务中的多线程设计
- 使用countdownLatch,将人群进行拆分,多线程进行处理,然后主线程阻塞等待下一批任务
- 使用最大线程数控制,原子类,判断线程数进行多线程开启,否则sleep,不占用cpu
接口中的多线程设计
使用jdk7的completeable并发请求,然后汇总结果,可以自定义线程池,默认任务队列int的max值,需要小心。
对线程池参数的理解
core:核心线程数
max:最大线程数,当队列满时才开始生效
任务队列:列表数组,链表数组,链表数据性能更加,两把锁,拿任务和塞任务不冲突
拒绝策略:当队列满切最大线程满,触发拒绝策略,一般有主线程处理,拒绝任务,抛弃旧的任务,抛弃新的任务
封装动态线程池
采用starter机制,由项目引入管理线程池。
- 采用redis作为注册中心,将线程池按照项目名称注册到redis
- 前端界面提交修改线程参数,消费消息更新线程池
- 定时任务更新队列任务到redis
- 前端查询直接查询redis信息