android 多线程 — 线程池线程数配置

ps:原谅我没干过后台开发,不了解线程池配置的更多内容,先写这么点


android 多线程 — 线程池线程数配置_第1张图片
好像要一个呀 ~

在《java虚拟机并发编程》一书中推荐我们使用系统可用的处理器核心数来匹配线程池数量

Runtime.getRuntime().availableProcessors()

常见2种任务:

  • 计算密集型 - 创建处理器可用核心数那么多的线程数就可以了,在这种情况下,创建更多的线程对程序的性能而言反而是不利的,因为当有多个任务处于就绪状态时,处理器核心需要在线程间频繁进行上下文切换,而这种切换对程序性能损耗较大。
  • IO密集型 - 那么我们需要开更多的线程来提高性能,执行 IO 操作线程会被阻塞,处理器可以立即进行上下文切换以便处理其他就绪线程,如果我们只有处理器可用核心数那么多线程的话,则即使有待执行的任务也无法处理,因为我们已经拿不出更多的线程供处理器调度了

那么如何区别计算密集型和IO密集型任务呢,这就要提到一个概念: 阻塞系数

阻塞系数 = 阻塞时间 / 总的运行时间,如果任务有 50% 的时间处于阻塞状态,则阻塞系数为0.5

如果任务被阻塞的时间 < 50%,任务就是计算密集型的,所需线程数将随之减少,但最少也不应该低于处理器的核心数。如果任务被阻塞的时间大于执行时间,即该任务是 IO 密集型的,我们就需要创建比处理器核心数大几倍数量的线程

网上有个公式:

线程数 = CPU可用核心数/(1 - 阻塞系数),其中阻塞系数的取值在0和1之间。

我们可以通过扩展线程池进行监控,继承线程池并重写线程池 beforeExecute、afterExecute、terminated方法,我们可以在任务执行前,执行后和线程池关闭前干一些事情。如监控任务的平均执行时间,最大执行时间和最小执行时间等,这几个方法在线程池里是空方法

你可能感兴趣的:(android 多线程 — 线程池线程数配置)