美文网首页
android 多线程 — 线程池线程数配置

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

作者: 前行的乌龟 | 来源:发表于2019-04-26 16:21 被阅读0次

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


    好像要一个呀 ~

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

    Runtime.getRuntime().availableProcessors()
    

    常见2种任务:

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

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

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

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

    网上有个公式:

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

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

    相关文章

      网友评论

          本文标题:android 多线程 — 线程池线程数配置

          本文链接:https://www.haomeiwen.com/subject/eakqnqtx.html