线程池

线程池的优点

  • 线程池中的线程可以重用,减少线程创建、销毁带来的系统开销;
  • 控制线程池的最大并发量,避免相互抢占系统资源而导致阻塞;
  • 对线程进行简单管理,提供定时执行,以及指定间隔循环执行;

ThreadPoolExecutor构造方法

public ThreadPoolExecutor(int corePoolSize,
                          int maximumPoolSize,
                          long keepAliveTime,
                          TimeUnit unit,
                          BlockingQueue<Runnable> workQueue,
                          ThreadFactory threadFactory)

参数说明:

  • corePoolSize

    线程池的核心数

  • maximumPoolSize

    线程池能容纳的最大线程数

  • keepAliveTime

    非核心线程闲置时间的超时时长,超过这个时长,非核心线程就会被回收。ThreadPoolExecutor的allowCoreThreadTimeOut属性为true,keepAliveTime同样会作用于核心线程。

  • unit

    超时时长的单位,常用的有TimeUnit.MILISECONDS\TimeUnit.SECONDS\TimeUnit.MINUTES等

  • workQueue

    线程池中的任务队列,通过线程池的execute方法提交Runnerable对象会存储在这个参数中

  • threadFactory

    线程工厂

ThreadPoolExecutor执行任务的规则

设:nThreadNow: 为当前线程数量; nCore: 核心线程数量; nPoolMax: 线程池最大值

  1. nThreadNow < nCore, 启动一个核心线程来执行任务;
  2. nThreadNow >= nCore && 工作队列未满, 将任务插入到工作队列;
  3. 工作队列已满 && nThreadNow < nPoolMax, 立即启动一个非核心线程来执行任务;
  4. nThreadNow >= nPoolMax, 拒绝执行此任务

线程池的分裂

Android中有四种常见的线程池:

  1. FixedThreadPool

    • 线程数量固定
    • 当线程处于空闲状态时,不会被回收
    • 当所有的线程处于活动状态时,新任务都会处于等待状态,直到有线程空闲出来
    • 只有核心线程
    • 没有超时机制
    • 任务队列没有大小限制
  2. CachedThreadPool 适用于执行大量耗时较少的任务

    • 线程数量不固定
    • 只有非核心线程
    • 线程池中的线程都处于活动状态,新建线程来处理新任务;否则利用空闲线程处理新任务
    • 空闲线程都有超时机制
  3. ScheduledThreadPool 适用于执行定时任务、具有固定周期的重复任务

    • 核心线程数量固定
    • 非核心线程数没有限制
    • 非核心线程闲置时会被立即回收
  4. SingleThreadPool

    • 内部只有一个核心线程
    • 确保所有任务都在同一个线程中按顺序执行
posted @ 2017-01-22 15:13  ithaibo  阅读(136)  评论(0编辑  收藏  举报
请留下你的高见