美文网首页线程Android知识Android开发
Android:AsyncTask并行任务使用

Android:AsyncTask并行任务使用

作者: 筱南独舞 | 来源:发表于2017-02-20 11:05 被阅读154次

    近期被多次问道:1.多个AsyncTask是并行还是串行;2.如何实现并行。平时没有在意这个问题,所以没有解释清楚,今天总结一下吧:
      1.先说并行还是串行这个问题吧:从1.5引入的时候的确是串行的,在1.6-2.3.2的时候执行顺序更改为并行了,在3.0之后又改回了串行。问题到此为止吧!不要去介意这个了。


    2.那么在平时使用中如何实现并行呢?

    1. 最直接的办法就是在new MyAsyncTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXRCUTOR);
      这样使用了AsyncTask默认的线程池,如果要自定义并行线程数,可以用第二个方法:
    2. ExecutorService exec = Executors.newFixedThreadPool(int i); // i为自定义的线程数量。
      然后使用new MyAsyncTask().executeOnExecutor(exec);

    到此可以结束了,下面是一些与之相关的AsyncTask源码,看过的源码的人可以直接关闭了。

    private static final int CPU_COUNT = Runtime.getRuntime().availableProcessors();
    private static final int CORE_POOL_SIZE = Math.max(2, Math.min(CPU_COUNT - 1, 4));
    private static final int MAXIMUM_POOL_SIZE = CPU_COUNT * 2 + 1;
    private static final int KEEP_ALIVE_SECONDS = 30;
    private static final BlockingQueue<Runnable> sPoolWorkQueue = new LinkedBlockingQueue<Runnable>(128);
    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());
        }
    };
    // 看这里,刚才用到的
    public static final Executor THREAD_POOL_EXECUTOR;
    static {
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE_SECONDS, TimeUnit.SECONDS, sPoolWorkQueue,  sThreadFactory);
        threadPoolExecutor.allowCoreThreadTimeOut(true);
        THREAD_POOL_EXECUTOR = threadPoolExecutor;
    }
    
    AsyncTask里executeOnExecutor的部分解释.png

    相关文章

      网友评论

        本文标题:Android:AsyncTask并行任务使用

        本文链接:https://www.haomeiwen.com/subject/qhmswttx.html