线程池学习及相对应的sdk中注释翻译

Android中有时候会用到很多线程去处理问题,但是开启多条线程很不明智,会有很大开销,这时候就可以用到线程池。

一.线程池的好处
1.服用线程,避免多次创建和关闭线程产生的开销
2.控制最大线程并发数量

二.Android中线程池的创建
在Android中可以利用Executors的工厂方法来创建线程池,但其实都是调用了
new ThreadPoolExecutor()方法去创建,不过是构造器中传入的参数不同,所
以可以先看下ThreadPoolExecutor类的构造器和它的参数意义。

/**
 * Creates a new {@code ThreadPoolExecutor} with the given initial
 * parameters and default thread factory and rejected execution handler.
 * It may be more convenient to use one of the {@link Executors} factory
 * methods instead of this general purpose constructor.
 *
 * @param corePoolSize    核心线程数,保持在线程池中的线程数,即使它
 *                        们是空闲的,除非allowCoreThreadTimeOut
 *                        被设置,否则他们是不会被自动回收的
 * @param maximumPoolSize 允许在线程池中的最大线程数量,包含核心线程
 *                        数和非核心线程数,如果设置超时时间,非核心
 *                        线程数空闲超时会被回收掉
 * @param keepAliveTime   超时时间,如果线程数超过了核心线程数(也就是
 *                        有非核心线程),非核心线程如果在这个时间内没
 *                        有新的任务就会被回收allowCoreThreadTimeOut
 *                        被设置为true的话,这个时间也会作用到核心线程
 *                        ,也就是说核心线程也会超时被回收
 * @param unit            keepAliveTime的时间单位(秒,微秒。。。)
 * @param workQueue       保存还未执行的任务的队列
 * @throws IllegalArgumentException if one of the following holds:<br>
 *         {@code corePoolSize < 0}<br>
 *         {@code keepAliveTime < 0}<br>
 *         {@code maximumPoolSize <= 0}<br>
 *         {@code maximumPoolSize < corePoolSize}
 * @throws NullPointerException if {@code workQueue} is null
 */
public ThreadPoolExecutor(int corePoolSize,
                          int maximumPoolSize,
                          long keepAliveTime,
                          TimeUnit unit,
                          BlockingQueue<Runnable> workQueue) {
    this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
         Executors.defaultThreadFactory(), defaultHandler);
}

“`
ThreadPoolExecutor执行任务大致遵循以下规则
1.运行线程数未超过核心线程数量,会直接启动核心线程执行任务
2.核心线程都在执行任务,后续任务会被插入队列中等待(所以CachedThreadPool
最大线程数基本无穷大,但是队列无法保存任务,会立即执行任务)
3.在2的条件下,如果队列插满了任务,如果线程数未超过最大数量规定,会启动
一个非核心线程来处理任务
4.在3的条件下,如果任务满了,而且线程数量也到达最大了,任务会被拒绝,调用
RejectedExecutionHandler的rejectedeExecution来通知调用者

利用Executors的工厂方法创建的线程池都是基于他来构建。大类分为4中
1.FixedThreadPool
顾名思义,就是固定线程数量的线程池
这里写图片描述
创建方式就是newFiedThreadPool().可以看到的是corePoolSizemaximumPoolSize 设置的是相等的,也就是核心线程和最大线程数相等,意思就是
只有核心线程,而且没有超时限制,新的还未来的及执行的任务都会保存到队列中
直到有空闲线程,这样可以使它快速响应外界请求。创建和销毁的开销很小,但是
并发量也被限制。
2.CachedThreadPool
2.CachedThreadPool
从参数可以看到核心线程数为0,但是最大线程数是Integer.MAX_VALUE,在实际
开发中可以认为无穷大了,而且SynChronousQueue可以看作无法保存任务队列,
他会接到任务就直接交付执行,等于说这个线程池会来一个任务就创建线程加入线
程池,但是他会在之前检查是否有空闲线程,而且没有因为超时被回收,如果有就
复用,没有才创建新的,所以这个线程池适合做大量且执行时间很短的任务。
3.ScheduledThreadPool
这里写图片描述
newScheduledThreadPool最终调用了构造器,构造器内部调用了父类构造器,核
超时时间也不长,空闲线程会很快被回收这个线程池可以延时或周期性重复执行任
务,也可以延时后周期执行。
4.SingleThreadPool
这里写图片描述
可以看到核心线程就一个,而且最大线程数量也就一个,说到底,他就是只有一个线
程的线程池,那他与普通线程有啥区别,他的意义就在于可以串行执行多个任务,不
需要处理多线程问题,而普通线程不容易做到连续接到任务,但后挨个执行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值