Android 線程池

Java爲我們提供了ExecutorService線程池來優化和管理線程的使用
使用線程池管理線程的優點

1、線程的創建和銷燬由線程池維護,一個線程在完成任務後並不會立即銷燬,而是由後續的任務複用這個線程,從而減少線程的創建和銷燬,節約系統的開銷

2、線程池旨在線程的複用,這就可以節約我們用以往的方式創建線程和銷燬所消耗的時間,減少線程頻繁調度的開銷,從而節約系統資源,提高系統吞吐量

3、在執行大量異步任務時提高了性能

4、Java內置的一套ExecutorService線程池相關的api,可以更方便的控制線程的最大併發數、線程的定時任務、單線程的順序執行等

使用ThreadPoolExecutor創建一個線程池管理類:

package com.pdoctor4u.activity;

import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * Created by chenxiangyu on 16/2/19.
 */
public class ThreadManager {
    private static ThreadProxyPool threadProxyPool;
    private static Object obj = new Object();


    public static ThreadProxyPool getThreadProxyPool() {
        synchronized (obj) {
            if (threadProxyPool == null) {
                threadProxyPool = new ThreadProxyPool(5,5,5L);
            }
            return threadProxyPool;
        }
    }


    public static class ThreadProxyPool {
        private ThreadPoolExecutor threadPoolExecutor;
        private int corePoolSize;
        private int maximumPoolSize;
        private long keepAliveTime;

        private ThreadProxyPool() {

        }

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

        public void excute(Runnable runnable) {
            if (runnable == null) {
                return;
            }
            if (threadPoolExecutor == null || threadPoolExecutor.isShutdown()) {
                threadPoolExecutor = new ThreadPoolExecutor(
                        //3  核心線程數
                        corePoolSize,
                        //5 最大線程數
                        maximumPoolSize,
                        //沒有執行任務的線程存活時間
                        keepAliveTime,
                        //存活時間的單位
                        TimeUnit.MICROSECONDS,
                        //線程中要準備去執行任務排隊的隊列
                        new LinkedBlockingDeque<Runnable>(),
                        //線程的工廠,創建線程
                        Executors.defaultThreadFactory(),
                        //隊列中如果放置不下任務時候的異常處理
                        new ThreadPoolExecutor.AbortPolicy());
            }
            threadPoolExecutor.execute(runnable);
        }

        //需要中止的是線程池中任務隊列裏面的任務
        public void cancel(Runnable runnable) {
            if (runnable != null) {
                //獲取線程池對象,然後從其內部去移除相應的任務
                threadPoolExecutor.getQueue().remove(runnable);
            }
        }

    }
}

官方也不推薦使用這種方法來創建線程池,而是推薦使用Executors的工廠方法來創建線程池,Executors類是官方提供的一個工廠類,它裏面封裝好了衆多功能不一樣的線程池,從而使得我們創建線程池非常的簡便,主要提供瞭如下四種功能不一樣的線程池:
newCachedThreadPool創建一個可緩存線程池,如果線程池長度超過處理需要,可靈活回收空閒線程,若無可回收,則新建線程。
newFixedThreadPool 創建一個定長線程池,可控制線程最大併發數,超出的線程會在隊列中等待。
newScheduledThreadPool 創建一個定長線程池,支持定時及週期性任務執行。
newSingleThreadExecutor 創建一個單線程化的線程池,它只會用唯一的工作線程來執行任務,保證所有任務按照指定順序(FIFO, LIFO, 優先級)執行。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章