AsyncTask 各大版本不同

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)个任务加入才会开启非核心线程。也就是说要开启新的线程的成本更大了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 从哪说起呢? 单纯讲多线程编程真的不知道从哪下嘴。。 不如我直接引用一个最简单的问题,以这个作为切入点好了 在ma...
    Mr_Baymax阅读 7,809评论 1 17
  • 第5章 多线程编程 5.1 线程基础 5.1.1 如何创建线程 在java要创建线程,一般有==两种方式==:1)...
    AndroidMaster阅读 5,776评论 0 11
  • AsyncTask 是 Android 中一个异步处理的框架,它内部集成了线程池和 Handler 机制,实现了异...
    未见哥哥阅读 7,850评论 0 9
  • (一)我不知不觉地,选了一条苦行的路。 也许在顿悟的刹那,便已悟得真谛。 也许要千年的修行,才能修成正果。 只是在...
    歌德与巴赫阅读 2,472评论 0 0
  • 有点怀念北京的阳光 大风 甚至那个阴霾的天气 总以为 离开后不会想念 其实现在才发现 原来真的只有来过 才会有再见
    晴天兔子阅读 1,045评论 0 0

友情链接更多精彩内容