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内部实现原理的主要内容,如果未能解决你的问题,请参考以下文章

# Java 常用代码片段

# Java 常用代码片段

片段内部静态类和gradle问题

片段中ListView的setOnItemClickListener

Handle的原理代码实现

PyTorch 交叉熵损失函数内部原理简单实现