美文网首页
AsyncTask 各大版本不同

AsyncTask 各大版本不同

作者: 红色草丛 | 来源:发表于2018-03-13 23:02 被阅读0次

1.6之前

用一个单一的后台线程串行执行多个AsyncTask实例的任务

1.6改变

只有1个线程池,核心线程数为5,最大线程数为128,任务队列容量为10。

也就是说当线程池中的线程数量没到5个,那么有新的任务会直接启动一个核心线程来执行任务,如果线程池中的线程数量达到了5个,然后任务会被插入到任务队列中等待执行,要是任务队列也满了,就会判断线程池中的数量是否已经达到最大线程数128,如果没有达到就会立刻启动一个非核心线程来执行任务。如果线程数量已经达到线程池规定的最大值,那么就会拒绝执行该任务。也就是说该线程池最多能同时接纳138个任务,其中有128个任务可以同时执行。而且该版本只有一个execute(Params... params) 方法,说明不能自定义线程池来执行任务。


3.0改变

又回到了当初的单一串行执行任务

提供了SerialExecutor,核心线程数默认只有一个  其他任务只能等待当前任务执行完在执行

但是可以修改SerialExecutor

相对于上一次修改这次主要的变化可以使用默认的SerialExecutor串行执行任务,也可以自定义Executor 并行


4.1改变

可以在子线程创建

在Android 4.1(API 16)以后,在APP主线程ActivityThread的main函数里面,直接调用了AscynTask.init函数确保这个类是在主线程初始化的;另外,init这个函数里面获取了InternalHandler的Looper,由于是在主线程执行的,因此,AsyncTask的Handler用的也是主线程的Looper。


4.4

4.4版本以后的线程池数量改为了动态的,以双核心为例,先获取CPU的核心数为2,线程池的核心线程为3,最大线程数为5,而阻塞队列的容量变为了128。为什么会有这样的改动?可能谷歌公司觉得开启的线程数过多会影响效率吧。而阻塞队列从容量为10变为了128是一个很有意思的事情。在4.4以前的版本,如果已经达到了线程池的核心线程数5,切阻塞队列也达到了10,再有任务加入,就会启动新的非核心线程,也就是说只要同时又16个任务进入就会开启非核心线程。而现在需要132(3+128+1)个任务加入才会开启非核心线程。也就是说要开启新的线程的成本更大了。

相关文章

网友评论

      本文标题:AsyncTask 各大版本不同

      本文链接:https://www.haomeiwen.com/subject/bhatqftx.html