开发中为什么要使用线程池
- 降低资源的消耗。通过重复利用已经创建好的线程,降低线程创建和销毁带来的损耗。
- 提高响应速度。因为线程池中的线程数没有超过最大上限时,有的线程处于等待分配任务的状态,当任务来时无需创建新的线程就能运行。
- 提高线程的可管理性。线程池会根据当前系统的特点对池内的线程进行优化处理,减少创建和销毁线程带来的系统开销。无限的创建和销毁线程不仅消耗系统资源,还降低系统的稳定性,使用线程池可以进行统一分配。
七大参数:
- corePoolSize : 核心线程数[一直存在除非设置了allowCoreThreadTimeOut];线程池创建好(new Thread())以后就准备就绪的线程数量,就等待来接收异步任务去执行。
- maximumPoolSize :最大线程数;控制资源(即使100万个异步任务也按最大线程数量运行)
- keepAliveTime :存活时间;如果当前正在运行的线程数量大于核心数量;释放空闲线程(最大线程数-核心线程数) 只要线程空闲大于指定keepAliveTime。
- unit : keepAliveTime的时间单位
- BlockingQueue workQueue :阻塞队列;如果任务有很多,就会将目前多的任务放在队列里面,只要有线程空闲,就会去队列里面取出新的任务继续执行。
- threadFactory :线程的创建工厂。
- RejectedExecutionHandler handler :如果队列(workQueue)满了,按照指定的拒绝策略,拒绝执行任务。
工作顺序:
- 线程池创建,准备好corePoolSize数量的核心线程,准备接受任务。
- 新的任务进来,用core准备好的空闲线程执行。
2.1. 核心线程满了,就将再进来的任务放入阻塞队列中,空闲的核心线程就会自己去阻塞队列获取任务执行。
2.2. 阻塞队列满了,就直接开新线程执行,最大只能开到maximumPoolSize指定的值。
2.3. max都执行好了,新建(最大线程数-核心线程数)的空闲线程会在keepAliveTime指定的时间后自动销毁,最终保持到核心线程数(core)的大小。
2.4. 如果线程数开到了max的数量,还有新任务进来,就会使用handler指定的拒绝策略进行处理。
- 所有的线程都是由指定的threadFactory创建的。
posted @
2022-01-19 13:34
fjhnb
阅读(
307)
评论()
编辑
收藏
举报
点击右上角即可分享
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!