知识养成了思想,思想同时又在融化知识。这篇文章主要讲述Android开发——线程池相关的知识,希望能为你提供帮助。
为什么要用线程池
- 新启线程需要新建——执行任务——销毁这个过程,我们准备一批线程放在那,当需要执行任务的时候就可以直接拿到线程来用,节约了新建和销毁的过程,提高效率。
- 线程资源是稀缺而昂贵的,所以我们需要利用线程池统一管理,限制线程数。
创建线程池时各个参数的含义
- corepoolsize:线程池的核心线程数
- maxnumpoolsize:最大线程数
- keepalivetime:线程空闲存活时间
- unit:时间单位
- BlickingQueue:阻塞队列(最好用有界队列)
- ThreadFactory:对线程池的微调工作
- RejectedExecutionHandle:拒绝策略
- AbortPolicy:直接抛出异常,默认策略;
- CallerRunsPolicy:用调用者所在的线程来执行任务;
- DiscardOldestPolicy:丢弃阻塞队列中靠最前的任务,并执行当前任务;
- DiscardPolicy:直接丢弃任务;
线程池的工作机制
1)如果当前运行的线程少于corePoolSize,则创建新线程来执行任务(注意,执行这一步骤需要获取全局锁)。
2)如果运行的线程等于或多于corePoolSize,则将任务加入BlockingQueue。
3)如果无法将任务加入BlockingQueue(队列已满),则创建新的线程来处理任务。
4)如果创建新线程将使当前运行的线程超出maximumPoolSize,任务将被拒绝,并调用RejectedExecutionHandler.rejectedExecution()方法。
合理地配置线程池
- CPU密集型:最大线程数等于CPU核心数+1,减少CPU切换时间,让CPU处于工作状态,提高效率,+1是因为有的任务可能需要从虚拟内存拿数据,会很慢,CPU此时可以去执行别的任务。
- IO密集型:最大线程数*2,IO时间等待较长,等待时间可以让CPU去执行别的线程任务,提高CPU利用率。
- 混合型:如果CPU与IO时间差不多,则用两个线程池。如果CPU与IO耗时差很大,则用一个线程池就够了。
推荐阅读
- java.io.IOException: Could not find resource com/xxx/xxxMapper.xml
- android studio 导入外部库文件,以及将项目中module变成library引用依赖
- appium 介绍及环境搭建
- 把bitmap转成文件存入APP项目目录
- uniapp——头部导航栏右侧图标+文字配置
- android studio 点击布局文件隐藏弹出的键盘。
- Mybatis中Mapper.xml文件中注释存在中文报错问题
- SpringBoot2.x 给Controller的RequestMapping添加统一前缀
- 在Intune中同步Apple VPP令牌