AsnycTask内部实现原理
Posted jackie-zhang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AsnycTask内部实现原理相关的知识,希望对你有一定的参考价值。
AsnycTask 原理就是“线程池 + Handler”的组合。
AsyncTask 里的线程池:
private static final int CPU_COUNT = Runtime.getRuntime().availableProcessors(); private static final int CORE_POOL_SIZE = CPU_COUNT + 1; private static final int MAXIMUM_POOL_SIZE = CPU_COUNT * 2 + 1; private static final int KEEP_ALIVE = 1; private static final ThreadFactory sThreadFactory = new ThreadFactory() { private final AtomicInteger mCount = new AtomicInteger(1); public Thread newThread(Runnable r) { return new Thread(r, "AsyncTask #" + mCount.getAndIncrement()); } }; private static final BlockingQueue<Runnable> sPoolWorkQueue = new LinkedBlockingQueue<Runnable>(128); /** * An {@link Executor} that can be used to execute tasks in parallel. */ public static final Executor THREAD_POOL_EXECUTOR = new ThreadPoolExecutor(CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE, TimeUnit.SECONDS, sPoolWorkQueue, sThreadFactory);
从上面我们可以看到,
1、该线程池(即 THREAD_POOL_EXECUTOR)的核心线程数为 CPU 的核心数量 + 1,
2、最大线程数为 CPU 的核心数量 * 2 + 1,
3、过剩线程的存活时间为1s。这里要注意的是 sPoolWorkQueue 是静态阻塞式的队列,意味着所有的 AsyncTask 用的都是同一个 sPoolWorkQueue ,也就是说最大的容量为128个任务,若超过了会抛出异常。同时执行的线程数是5个线程。最后一个参数就是线程工厂了,用来制造线程。
4、AysnTask的线程池是串行的。
我们再来看看 AsyncTask 内部的任务执行器 SERIAL_EXECUTOR ,该执行器用来把任务传递给上面的 THREAD_POOL_EXECUTOR 线程池。在 AsyncTask 的设计中,SERIAL_EXECUTOR 是默认的任务执行器,并且是串行的,也就导致了在 AsyncTask 中任务都是串行地执行。当然,AsyncTask 也是支持任务并行执行的,这个点我们在下面再讲。
以上是关于AsnycTask内部实现原理的主要内容,如果未能解决你的问题,请参考以下文章