码迷,mamicode.com
首页 > 其他好文 > 详细

AsnycTask内部实现原理

时间:2018-09-28 12:44:19      阅读:269      评论:0      收藏:0      [点我收藏+]

标签:maximum   核心   class   ret   pre   mic   cond   workqueue   hat   

 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内部实现原理

标签:maximum   核心   class   ret   pre   mic   cond   workqueue   hat   

原文地址:https://www.cnblogs.com/Jackie-zhang/p/9717316.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!