关于AsyncTask的那些事

  一直以来就简单的认为有多少个网络请求直接new多少个AsyncTask,但是这显然不行的

a、线程的生命周期的开销还是相当高的,大量的线程的创建将消耗大量的计算机资源

b、可创建线程的数量存在一个限制值(这个值由平台觉得,且受很多因素的制约),如果超过这个限制,可能会报OOM错误

c、在一定范围内,增加线程可以提高系统吞吐量,但是超过了这个范围,就物极必反了,只会降低程序的执行速度。

如果Gridview或者ListView这类控件加载的数量非常大的,会消耗大量的内存和资源

推荐使用一般是1-2个网络线程+阻塞队列 所有任务在队列中,那1-2个线程,不断从队列中获取数据

(关于阻塞队列 可以看看

http://endual.iteye.com/blog/1412212

www.cnblogs.com/linjiqin/archive/2013/05/30/3108188.html

 

android1.5,1.6-2.3以及3.0这几个阶段AsyncTask的改动参看地址:

http://blog.csdn.net/pipisky2006/article/details/8535454

 

AsyncTask的源码分析 参看郭神博客: http://blog.csdn.net/guolin_blog/article/details/11711405

 

接着是关于线程池以及阻塞队列的问题

这个是1.6-2.3的AsynTask部分源码

private static final int CORE_POOL_SIZE =5;//5个核心工作线程 
private static final int MAXIMUM_POOL_SIZE = 128;//最多128个工作线程 
private static final int KEEP_ALIVE = 1;//空闲线程的超时时间为1秒 
private static final BlockingQueue<Runnable> sWorkQueue = 
new LinkedBlockingQueue<Runnable>(10);//等待队列 
//线程池是静态变量,所有的异步任务都会放到这个线程池的工作线程内执行。
private static final ThreadPoolExecutorsExecutor =
new ThreadPoolExecutor(CORE_POOL_SIZE, 
MAXIMUM_POOL_SIZE, KEEP_ALIVE, TimeUnit.SECONDS,
sWorkQueue,sThreadFactory);

 

 

  此处代码可理解为: 当前线程池每次并行5个线程,最大可扩展为128个线程(动态算法扩展),阻塞队列阻塞10个线程

  (动态算法扩展:如果长期阻塞队列阻塞,会动态改变线程池大小,如果运行过快会减小大小,

     所以线程池会有上限和下限

     阻塞队列:当队列满的时候,会阻塞你的入队操作,当队列有空闲,阻塞状态取消,入队)

 

   如果线程池中已5个运行线程,阻塞队列里已经存放10个线程,新添加的线程处于阻塞状态,不入阻塞队列,不放入线程池(放入线程池,说明该线程正在运行)

 

 

猜你喜欢

转载自l-willin.iteye.com/blog/2090667