Android线程池及Bitmap加载和Cache

{\rtf1}由于这部分知识我已有所了解,所以这里便不详细介绍了 大体记录一下平时容易忘记的细节东西,方便以后忘记了回头看用

线程池

线程池的优点大概可以分为以下三点:

1.重用线程池中的线程,避免由于创建和销毁线程带来的巨大开销
2.能有效控制线程池的最大并发数,避免大量线程间因互相抢占资源而导致的阻塞现象
3.能够对线程进行简单的管理,并提供定时执行及指定间隔循环执行等功能

线程池的的几个常用属性:

    ThreadPoolExecutor是线程池的真正实现
    它有几个参数比较重要:
    corePoolSize   线程的核心线程数 默认下核心线程会在线程池中一直存活,即使它们处于闲置状态    
    maximumPoolSize  线程所能容纳的最大线程数  当活动线程数达到这个数量后,有新的任务到来会被阻塞 拒绝执行
    keepAliveTime  非核心线程存活的时间 超过此时间 非核心线程会被回收  如果ThreadPoolExecutor的allowCoreThreadTimeOut设置为true  那么这个属性同时也作用于核心线程  默认不作用与核心线程 
    unit  用于指定keepAliveTime的单位  这是一个枚举  常用的有 TimeUnit.MILLISECONDS毫秒   TimeUnit.SECONDS秒  以及 TimeUnit.MINUTES分钟  
    workQueue  线程池中的任务队列  通过execute提交的任务会存在这个队列中等待执行  
    threadFactory  线程工厂  为线程池提供创建新线程的功能  
    其中线程池还有一个不常用的参数  RejectedExecutionHandler handler  当线程无法执行新任务  比如最大线程数队列已满  或者无法成功执行时,就会调用 handler的rejectedExecution方法  默认会抛出一个RejectedExecutionException异常  

线程池在执行任务时大致遵循如下规则:

1.如果核心线程数量未达到  那么开启一个核心线程执行任务  
2.如果核心线程数量达到了  那么插入任务队列中排队等待执行
3.如果无法插入到等待队列 往往由于等待队列已满  这时候启动一个非核心线程执行任务
4.如果线程数量已经达到最大,无法启动新的非核心线程,那么拒绝执行此任务  抛出RejectedExecutionException异常 

四种常用的线程池:

先看一看ThreadPoolExecutor的构造函数 参数
 public ThreadPoolExecutor(int corePoolSize,
                          int maximumPoolSize,
                          long keepAliveTime,
                          TimeUnit unit,
                          BlockingQueue<Runnable> workQueue)

1.FixedThreadPool   
public static ExecutorService newFixedThreadPool(int nThreads) {
        return new ThreadPoolExecutor(nThreads, nThreads,
                                      0L, TimeUnit.MILLISECONDS,
                                      new LinkedBlockingQueue<Runnable>());
    }
从FixedThreadPool的创建看  它有固定数量的核心线程  最大线程数也是核心线程数  说明没有非核心线程  非核心线程存活时间为0   队列采用LinkedBlockingQueue  任务队列大小无限制  
所以它的核心线程不会被回收  能够更快的响应外界的请求  

2.CachedThreadPool
public static ExecutorService newCachedThreadPool() {
        return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                      60L, TimeUnit.SECONDS,
                                      new SynchronousQueue<Runnable>());
    }
核心线程数为0  非核心线程数没有限制  超时时间为60秒  队列为SynchronousQueue  此队列无法添加元素  
因此这个线程池的特性是  所有的线程都能被回收  当所有线程都处于闲置状态时  它会回收所有的线程  不占用系统的任何资源  所以这个线程池适合执行大量的耗时比较少的线程  

3.ScheduledThreadPool
 public ScheduledThreadPoolExecutor(int corePoolSize) {
        super(corePoolSize, Integer.MAX_VALUE,
              DEFAULT_KEEPALIVE_MILLIS, MILLISECONDS,
              new DelayedWorkQueue());
    }
核心线程数有限  非核心线程数无限制  10毫秒超时回收  DelayedWorkQueue队列  大小无限制  
这类线程池 主要用于执行定时任务和具有固定周期的重复任务  

4.SingleThreadExecutor
public static ExecutorService newSingleThreadExecutor() {
        return new FinalizableDelegatedExecutorService
            (new ThreadPoolExecutor(1, 1,
                                    0L, TimeUnit.MILLISECONDS,
                                    new LinkedBlockingQueue<Runnable>()));
    }
只有一个核心线程   非核心线程虽然为1  但是超时时间为0  不会存活
这说明此类线程池  所有的任务都在一个线程中按顺序执行  使得这类线程池不用考虑线程同步问题。。。

Bitmap加载

BitmapFactory.Options的inSampleSize 表示缩放的比例 如果是 2 那么表示宽和高都为原来的1/2 并且只能取2的指数 如果你取了 3 那么他会向下取整一个最接近的数 2 来 设置

Cache

LruCache和DiskLruCahce
内存缓存和磁盘缓存 。。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值