线程工具库封装总结

173 阅读2分钟

在一般Android APP 项目中,都会对线程使用做二次封装,作为公共线程组件来使用,目的就是为了统一收拢调用线程使用,统一化线程处理。本篇主要总结线程工具封装的需要注意的一些事项。

项目背景

线程杂乱,不利用后期管理,需要做统一梳理。

规范化处理

  1. ThreadFactory 应设置设置统一的线程名
  2. 设置合适的任务优先级
  3. 设置合理的任务拒绝策略RejectedExecutionHandler
  4. 合理的线程池参数设置

IO 型 和 CPU密集型 场景下线程数量的确定

确定线程数首先需要考虑到系统可用的处理器核心数:

Runtime.getRuntime().availableProcessors();

应用程序最小线程数应该等于可用的处理器核数。如果所有的任务都是计算密集型的,则创建处理器可用核心数这么多个线程就可以了,这样已经充分利用了处理器,也就是让它以最大火力不停进行计算。创建更多的线程对于程序性能反而是不利的,因为多个线程间频繁进行上下文切换对于程序性能损耗较大。

但如果任务都是IO密集型的,那我们就需要创建比处理器核心数大几倍数量的线程。为何?当一个任务执行IO操作时,线程将被阻塞,于是处理器可以立即进行上下文切换以便处理其他就绪线程。如果我们只有处理器核心数那么多个线程的话,即使有待执行的任务也无法调度处理了。

因此,线程数与我们每个任务处于阻塞状态的时间比例相关。加入任务有50%时间处于阻塞状态,那程序所需线程数是处理器核心数的两倍。我们可以计算出程序所需的线程数,公式如下:

线程数=CPU可用核心数/(1 - 阻塞系数),其中阻塞系数在在0到1范围内。

计算密集型程序的阻塞系数为0,IO密集型程序的阻塞系数接近1。

功能增强

  1. 设置 任务调度监听器实现
  2. 捕获异常,增强健壮性
  3. 复写钩子函数打点统计等
  4. 规范主线程调度处理