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

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

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,//核心線程數
                            maximumPoolSize,//最大線程數
                            keepAliveTime,//保持時間
                            unit,//保持時間對應的單位
                            workQueue,
                            threadFactory,//線程工廠
                            handler);//異常捕獲器
                }
            }
        }
        return mThreadPoolExecutor;
    }


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


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

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

}

FutureTask
FutureTask是實現了future的Runable,FutureTask比Runable多了一個執(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);
    }
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 一:使用線程池的原因 在android開發(fā)中經常會使用多線程異步來處理相關任務,而如果用傳統(tǒng)的newThread來...
    無問o閱讀 82,503評論 18 141
  • 線程 線程在Android中是個很重要的概念,從用途來說,線程分為主線程與子線程,主線程用于處理界面相關事情,子線...
    我好芒閱讀 29,138評論 0 34
  • 1 線程池簡介 線程池指的是ThreadPoolExecutor,它實現了ExecutorService接口,并封...
    秀葉寒冬閱讀 1,002評論 0 3
  • 一、為什么使用線程池1.線程池吃好處(1).對多個線程進行統(tǒng)一管理,避免資源競爭中出現問題(2).(重點)對線程進...
    思思入扣閱讀 224評論 0 0
  • 以米燕的成長軌跡為主線,寫在大山里長大的60后、70后女孩的命運。 上一章 福兮禍也 大概一個月之后,陳老師托一位...
    沐兒閱讀 1,442評論 26 22

友情鏈接更多精彩內容