AsyncTask源码分析

  次阅读 作者:智能小宝 来源:互联网 2016-01-14 12:44 我要评论(0)

AsyncTask 异步任务,可以很方便的在应用中执行下载等可能阻塞UI Thread的任务,现在分析一下它的源码

首先列出AsyncTask的一些核心方法和域:

public abstract class AsyncTask<Params, Progress, Result> {

private static final int CORE_POOL_SIZE = 5;//核心线程数

private static final int MAXIMUM_POOL_SIZE = 128;//最大线程数

private static final int KEEP_ALIVE = 1;//超时时间,当线程数超过核心线程数时,超过这个时间的空线程就会被销毁,直到线程数等于核心线程

private static final BlockingQueue<Runnable> sPoolWorkQueue =

new LinkedBlockingQueue<Runnable>(10);//用于传输和保持提交的任务。可以使用此队列与池大小进行交互

public static final Executor THREAD_POOL_EXECUTOR =

new ThreadPoolExecutor(CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE,

TimeUnit.SECONDS, sPoolWorkQueue, sThreadFactory);

public static final Executor SERIAL_EXECUTOR = new SerialExecutor();

}

其实AsyncTask的的核心就是一个ThreadPoolExecutor ,这是一个Java的线程池,在生成AsyncTask的时候,从线程池取出一个线程来运行你的代码

管理规则是这样的,

如果运行的线程少于 corePoolSize,则 Executor 始终首选添加新的线程,而不进行排队。

如果运行的线程等于或多于 corePoolSize,则 Executor 始终首选将请求加入队列,而不添加新的线程。

如果无法将请求加入队列,则创建新的线程,除非创建此线程超出 maximumPoolSize,在这种情况下,任务将被拒绝。

SERIAL_EXECUTOR 是维护线程安全,将新建的任务一个一个的加入到ThreadPoolExecutor 中。

通过源码解决的一些问题:

1. API中说AsyncTask只能运行在UI Thread,是这样么?

不是的,因为在生成AsyncTask和全局的线程池时,并没有对线程进行限制,只要所在的线程存在Looper(也就是调用过Looper.prepare的线程)都可以构造AsyncTask,所以在Service,Receiver中都可以构造AsyncTask。

2. AsyncTask建立的任务,是被立即执行么?

不是立即执行,根据上述的规则,当目前已经有五个任务执行的时候,此时线程数等于corePoolSize,那么再构造的AsyncTask就会进入sPoolWorkQueue,直到sPoolWorkQueue满为止,这些线程都是被阻塞的,必须要有核心线程执行完成,他们才会执行。

有趣的是,如果sPoolWorkQueue满了,这时再进来任务,就是构造新线程,执行此任务(而不是队列中的任务),所以你建立的AsyncTask不是按照构造的顺序来执行的,很可能后构造的反而先执行了。

3. AsyncTask构造的最大数量?

默认状态,在每个进程中,可以最够同时构造138个,其中同时运行128个,10个在阻塞队列之中,如果在构造就会抛出异常。

4. 如何对AsyncTask进行优化?

THREAD_POOL_EXECUTOR 是 public static final的,所以你可以访问到这个线程池,从而动态的设定 核心线程数、最大线程数等。除非你有特殊的情况处理,否则是没有必要进行修改的。

摘自 达小生

本站文章信息来源于网络以及网友投稿,本站只负责对文章进行整理、排版、编辑,是出于传递更多信息之目的,并不意味着赞同其观点或证实其内容的真实性。如果您有什么意见或建议,请联系QQ28-1688-302!

人工智能实验室
相关文章相关文章
  • 韩春雨称已能重复实验结果 近期将有消息公布

    韩春雨称已能重复实验结果 近期将有消息公布

  • 未来两年人工智能要怎么走?看这篇就够了

    未来两年人工智能要怎么走?看这篇就够了

  • 英国研发“杀生”机器人 通过生命体获取能量

    英国研发“杀生”机器人 通过生命体获取能量

  • 无人驾驶汽车如何改变城市生活?听听他们怎么说

    无人驾驶汽车如何改变城市生活?听听他们怎么说

网友点评网友点评
阅读推荐阅读推荐

据国外媒体报道,在过去两年内,聊天机器人(chatbot)、人工智能以及机器学习的研发和采用取得了巨大进展。许多初创公司正利用人工智能和...

霍金 视觉中国 图 英国著名物理学家霍金(Stephen Hawking)再次就人工智能(AI)发声,他认为:对于人类来说,强大AI的出现可能是最美妙的...

文|郑娟娟 今年,人工智能(AI) 60岁了。在AI60岁的时候,笔者想要介绍一下AI100,一个刚刚2岁的研究项目,但它的预设寿命是100年,甚至更长...

AlphaGo与李世石的人机大战,为大众迅速普及了人工智能的概念。 但对谷歌而言,除了下围棋,现在的人工智能进展到哪一步了?未来,人工智能...