Android线程池ThreadPoolExecutor参数详解

线程池机制

    corePoolSize: 核心线程数,能够同时执行的任务数量
    maximumPoolSize:除去缓冲队列中等待的任务,最大能容纳的任务数(其实是包括了核心线程池数量)
    keepAliveTime:超出workQueue的等待任务的存活时间,就是指maximumPoolSize里面的等待任务的存活时间
    unit:时间单位
    workQueue:阻塞等待线程的队列,一般使用new LinkedBlockingQueue<Runnable>()这个,如果不指定容量,
              会一直往里边添加,没有限制,workQueue永远不会满,一般选择没有容量上限的队列;
    threadFactory:创建线程的工厂,使用系统默认的类
    handler:当任务数超过maximumPoolSize时,对任务的处理策略,默认策略是拒绝添加
    执行流程:当线程数小于corePoolSize时,每添加一个任务,则立即开启线程执行
              当corePoolSize满的时候,后面添加的任务将放入缓冲队列workQueue等待;
              当workQueue也满的时候,看是否超过maximumPoolSize线程数,如果超过,默认拒绝执行,如果没有超过,则创建线程立即执行。
    举例说明:
    假如:corePoolSize=2,maximumPoolSize=3,workQueue容量为8;
          最开始,执行的任务A,B,此时corePoolSize已用完,再次执行任务C,则
          C将被放入缓冲队列workQueue中等待着,如果后来又添加了7个任务,此时workQueue已满,
          则后面再来的任务将会和maximumPoolSize比较,由于maximumPoolSize为3
          因为有2个在corePoolSize中运行了,所以只能容纳1个了,那么会立即创建线程执行。那么后面来的任务默认都会被拒绝--通常都会报异常。

* 线程池创建

    executor = new ThreadPoolExecutor(
            corePoolSize, //3
            maximumPoolSize,//5,当缓冲队列满,但是未达到最大线程数,创建线程立即执行,否则报异常。 
            keepAliveTime,  //最大线程数中的线程执行完后,会继续等待一段时间。
            unit,   //等待时间的单位
            new LinkedBlockingQueue<Runnable>(),//缓冲队列,超出核心线程池的任务会被放入缓存队列中等待
            Executors.defaultThreadFactory(),//创建线程的工厂类
            new ThreadPoolExecutor.AbortPolicy()//当最大线程池也超出的时候,则拒绝执行
            );

核心线程数corePoolSize的取值策略:
//核心线程池数量的计算规则:当前设备的可用处理器核心数*2 + 1,能够让CPU得到最大效率的发挥;
corePoolSize = Runtime.getRuntime().availableProcessors()*2+1;
maximumPoolSize = corePoolSize;//虽然用不到,但是不能是0,否则报错

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值