线程池

在操作系统中,线程是操作系统调度的最小单元,同时线程又是一种受限的系统资源,不可能无限制的产生,线程的创建和销毁都会有相应的开销,因此正确的做法是采用线程池,一个线程池中会缓存一定数量的线程,通过线程池就可以避免频繁创建和销毁线程所带来的开销。
线程池有如下几点好处:
1、重用线程池中的线程,避免因为线程的创建和销毁所带来的性能开销。
2、能够有效控制线程池的最大并发数,避免大量线程之间因为互相抢占系统资源而导致的阻塞现象。
3、能够对线程进行简单的管理,并提供定时执行以及指定间隔循环执行等功能。
Android中的线程池的概念源于Java中的Executor,Executor是一个接口,真正的线程池的实现是ThreadPoolExecutor。ThreadPoolExecutor提供了一系列的参数来配置线程池,通过不同的参数可以创建不同的线程池,下面介绍ThreadPoolExecutor构造函数中不同的参数含义:

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

corePoolSize
线程池的核心线程数。默认情况下,核心线程会在线程池中一直存活,即使他们处于闲置状态。但是如果将ThreadPoolExecutor的allowCoreThreadTimeOut设置为true,那么闲置的核心线程在等待新任务时会有超时策略,这个时间间隔由keepAliveTime指定,当等待时长超过keepAliveTime所指定的时长后,核心线程就会终止。
maximumPoolSize
线程池所能容纳的最大线程数。当活动线程数达到这个数值后,后续的新任务将会被阻塞。
keepAliveTime
非核心线程闲置时的超时时长,超过这个时长,非核心线程就会被回收。当ThreadPoolExecutor的allowCoreThreadTimeOut设置为true时,这个时长同样作用于核心线程。
unit
用于指定keepAliveTime参数的时间单位。
workQueue
线程池中的任务队列,通过线程池的execute方法提交的Runnable对象会存储在这个参数中。
threadFactory
线程工厂,为线程池提供创建新线程的功能。ThreadFactory是一个接口,他只有一个方法:Thread newThread(Runnable r)。
除了这些参数之外,还有一个不常用的参数RejectedExecutionHandler handler。当线程池无法执行新任务时,这有可能是由于任务队列已满或者是无法成功执行任务,这个时候ThreadPoolExecutor就会调用handler的rejectExecution方法来通知调用者,默认情况下rejectExecution会直接抛出一个RejectedExecutionException。
ThreadPoolExcution 为RejectedExecutionHandler提供了几个可选值,即线程池的饱和策略:
AbortPolicy 默认值 会直接抛出RejectedExecutionException
DiscardPolicy 丢弃策略 直接丢弃新请求的任务
DiscardOldestPolicy 丢弃最旧的,即丢弃线程队列中时间最旧的任务
CallerRunsPolicy 调用者执行,即推给任务的调用者执行,线程池中的任务既不丢弃也不新增
ThreadPoolExecutor执行任务时大致遵循如下原则:
1、如果线程池中的线程数量未达到核心线程数,那么就会直接启动一个核心线程来执行这个任务。
2、如果线程池中的线程数量已经达到或者超过核心线程数,那么任务会被插入到任务队列中排队等待执行。
3、如果在步骤2中无法将任务插入到任务队列中,这往往是由于任务队列已满,这个时候如果线程池中的线程数未达到线程池的最大线程数,那么就会立刻启动一个非核心线程来执行任务。
4、如果步骤3中的线程数量已经达到线程池规定的最大线程数,那么就拒绝执行此任务,ThreadPoolExecutor会调用RejectedExecutionHandler的rejectedExecution方法来通知调用者。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值