android|android 多线程 — 线程池线程数配置
ps:原谅我没干过后台开发,不了解线程池配置的更多内容,先写这么点
文章图片
好像要一个呀 ~ 在《java虚拟机并发编程》一书中推荐我们使用系统可用的处理器核心数来匹配线程池数量
Runtime.getRuntime().availableProcessors()
常见2种任务:
- 计算密集型 - 创建处理器可用核心数那么多的线程数就可以了,在这种情况下,创建更多的线程对程序的性能而言反而是不利的,因为当有多个任务处于就绪状态时,处理器核心需要在线程间频繁进行上下文切换,而这种切换对程序性能损耗较大。
- IO密集型 - 那么我们需要开更多的线程来提高性能,执行 IO 操作线程会被阻塞,处理器可以立即进行上下文切换以便处理其他就绪线程,如果我们只有处理器可用核心数那么多线程的话,则即使有待执行的任务也无法处理,因为我们已经拿不出更多的线程供处理器调度了
阻塞系数 = 阻塞时间 / 总的运行时间,如果任务有 50% 的时间处于阻塞状态,则阻塞系数为0.5如果任务被阻塞的时间 < 50%,任务就是计算密集型的,所需线程数将随之减少,但最少也不应该低于处理器的核心数。如果任务被阻塞的时间大于执行时间,即该任务是 IO 密集型的,我们就需要创建比处理器核心数大几倍数量的线程
网上有个公式:
【android|android 多线程 — 线程池线程数配置】线程数 = CPU可用核心数/(1 - 阻塞系数),其中阻塞系数的取值在0和1之间。我们可以通过扩展线程池进行监控,继承线程池并重写线程池 beforeExecute、afterExecute、terminated方法,我们可以在任务执行前,执行后和线程池关闭前干一些事情。如监控任务的平均执行时间,最大执行时间和最小执行时间等,这几个方法在线程池里是空方法
推荐阅读
- 放屁有这三个特征的,请注意啦!这说明你的身体毒素太多
- android第三方框架(五)ButterKnife
- 爱就是希望你好好活着
- 昨夜小楼听风
- 知识
- 死结。
- 我从来不做坏事
- 烦恼和幸福
- 关于QueryWrapper|关于QueryWrapper,实现MybatisPlus多表关联查询方式
- Android中的AES加密-下