Android ThreadPool、AsyncTask、Future、FutureTask、Callable和Runable

使用多線程用new Thread():
1.多任務(wù)情況下,避免線程頻繁的創(chuàng)建銷毀;
2.多個(gè)線程頻繁的創(chuàng)建會(huì)占用大量的資源,并且在資源競(jìng)爭(zhēng)的時(shí)候出現(xiàn)問(wèn)題,缺乏統(tǒng)一的管理,容易造成線程卡頓;
3.多個(gè)線程頻繁銷毀,會(huì)頻繁調(diào)用GC機(jī)制,降低性能并且耗時(shí);
線程池的作用:
1.對(duì)線程統(tǒng)一管理,避免資源競(jìng)爭(zhēng)造成卡頓、死機(jī)等問(wèn)題;
2.對(duì)線程服用,不會(huì)在線程結(jié)束后立即銷毀,等待其他任務(wù)。避免了頻繁創(chuàng)建、銷毀和調(diào)用GC機(jī)制

public class ThreadPool {
    ThreadPoolExecutor mThreadPoolExecutor;

    private int corePoolSize;
    private int maximumPoolSize;
    private long keepAliveTime;

    private static ThreadPool mThreadPool = null;

    public static ThreadPool getInstance() {
        if (mThreadPool == null) {
            synchronized (ThreadPool.class){
                mThreadPool = new ThreadPool(5, 10, 5 * 1000);
            }
        }
        return mThreadPool;
    }

    private ThreadPool(int corePoolSize, int maximumPoolSize, long keepAliveTime) {
        this.corePoolSize = corePoolSize;
        this.maximumPoolSize = maximumPoolSize;
        this.keepAliveTime = keepAliveTime;
    }

    private ThreadPoolExecutor initExecutor() {
        if (mThreadPoolExecutor == null) {
            synchronized (ThreadPool.class) {
                if (mThreadPoolExecutor == null) {

                    TimeUnit unit = TimeUnit.MILLISECONDS;
                    ThreadFactory threadFactory = Executors.defaultThreadFactory();
                    RejectedExecutionHandler handler = new ThreadPoolExecutor.AbortPolicy();
                    LinkedBlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<>();

                    mThreadPoolExecutor = new ThreadPoolExecutor(
                            corePoolSize,//核心線程數(shù)
                            maximumPoolSize,//最大線程數(shù)
                            keepAliveTime,//保持時(shí)間
                            unit,//保持時(shí)間對(duì)應(yīng)的單位
                            workQueue,
                            threadFactory,//線程工廠
                            handler);//異常捕獲器
                }
            }
        }
        return mThreadPoolExecutor;
    }


    /**
     * 執(zhí)行任務(wù)
     */
    public void executeTask(Runnable r) {
        initExecutor();
        mThreadPoolExecutor.execute(r);
    }


    /**
     * 提交任務(wù)
     */
    public Future<?> commitTask(Runnable r) {
        initExecutor();
        return mThreadPoolExecutor.submit(r);
    }

    /**
     * 刪除任務(wù)
     */
    public void removeTask(Runnable r) {
        initExecutor();
        mThreadPoolExecutor.remove(r);
    }

}

FutureTask
FutureTask是實(shí)現(xiàn)了future的Runable,F(xiàn)utureTask比Runable多了一個(gè)執(zhí)行的返回值

 private void test(){

        AsyncTask<Boolean,String,Integer> asyncTask = new AsyncTask<Boolean, String, Integer>() {

            @Override
            protected Integer doInBackground(Boolean... booleans) {
                return null;
            }

            @Override
            protected void onPreExecute() {
                super.onPreExecute();
            }

            @Override
            protected void onPostExecute(Integer integer) {
                super.onPostExecute(integer);
            }

            @Override
            protected void onProgressUpdate(String... values) {
                super.onProgressUpdate(values);
            }

            @Override
            protected void onCancelled(Integer integer) {
                super.onCancelled(integer);
            }

            @Override
            protected void onCancelled() {
                super.onCancelled();
            }
        };
        asyncTask.execute();
        asyncTask.getStatus();

        Callable<Boolean> callable = new Callable<Boolean>() {
            @Override
            public Boolean call() throws Exception {
                return false;
            }
        };
        FutureTask futureTask = new FutureTask(callable );
        futureTask.cancel(true);

        ThreadPoolExecutor poolExecutor = new ThreadPoolExecutor(
                2,10,300,
                TimeUnit.MICROSECONDS,new LinkedBlockingDeque<Runnable>(),
                Executors.defaultThreadFactory(),new ThreadPoolExecutor.AbortPolicy());
        Future<Boolean> future= poolExecutor.submit(callable);
        future.cancel(true);
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一:使用線程池的原因 在android開(kāi)發(fā)中經(jīng)常會(huì)使用多線程異步來(lái)處理相關(guān)任務(wù),而如果用傳統(tǒng)的newThread來(lái)...
    無(wú)問(wèn)o閱讀 82,544評(píng)論 18 141
  • 線程 線程在Android中是個(gè)很重要的概念,從用途來(lái)說(shuō),線程分為主線程與子線程,主線程用于處理界面相關(guān)事情,子線...
    我好芒閱讀 29,151評(píng)論 0 34
  • 1 線程池簡(jiǎn)介 線程池指的是ThreadPoolExecutor,它實(shí)現(xiàn)了ExecutorService接口,并封...
    秀葉寒冬閱讀 1,013評(píng)論 0 3
  • 一、為什么使用線程池1.線程池吃好處(1).對(duì)多個(gè)線程進(jìn)行統(tǒng)一管理,避免資源競(jìng)爭(zhēng)中出現(xiàn)問(wèn)題(2).(重點(diǎn))對(duì)線程進(jìn)...
    思思入扣閱讀 232評(píng)論 0 0
  • 以米燕的成長(zhǎng)軌跡為主線,寫(xiě)在大山里長(zhǎng)大的60后、70后女孩的命運(yùn)。 上一章 福兮禍也 大概一個(gè)月之后,陳老師托一位...
    沐兒閱讀 1,444評(píng)論 26 22

友情鏈接更多精彩內(nèi)容