定製自己的線程池管理類、防止OOM

在Android開發中、涉及比較深的話、我們會用到線程池來做異步操作
比如下載圖片、執行異步任務等、爲了方便管理、繼承一個線程池管理類、
在使用線程的時候只需要 submmitJob和removeJob、不會產生大量的線程、有效防止OOM
代碼如下:


import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class ThreadPool {
    private static final String TAG = "ThreadPool";
    private static ThreadPool instance;
    private ThreadPoolExecutor threadPool = null;
    private static final int CORE_POOL_SIZE = 3;
    private static final int MAX_POOL_SIZE = 8;
    private static final int KEEP_ALIVE_TIME = 10; // 10 seconds

    private ThreadPool() {
        threadPool = new ThreadPoolExecutor(CORE_POOL_SIZE,MAX_POOL_SIZE,KEEP_ALIVE_TIME,
                TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(),
                new PriorityThreadFactory("mthread-pool",
                android.os.Process.THREAD_PRIORITY_BACKGROUND));
    }

    public static synchronized ThreadPool getInstance(){
        if(instance == null){
            instance = new ThreadPool();
        }
        return instance;
    }

    public void removeJob(Runnable task){
        threadPool.remove(task);
    }

    /***
     * 線程池執行command
     * @param r
     */
    public void submmitJob(Runnable r){
        threadPool.execute(r);
    }

}

使用說明

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ThreadPool.getInstance().submmitJob(r);
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        ThreadPool.getInstance().removeJob(r);
    }
    private Runnable r = new Runnable() {
        @Override
        public void run() {
        //do something
        }
    };

參數說明

參數名 作用
corePoolSize 核心線程池大小
maximumPoolSize 線程池中超過corePoolSize數目的空閒線程最大存活時間;可以allowCoreThreadTimeOut(true)使得核心線程有效時間
TimeUnit keepAliveTime時間單位
workQueue 阻塞任務隊列
threadFactory 新建線程工廠
RejectedExecutionHandler 當提交任務數超過maxmumPoolSize+workQueue之和時,任務會交給RejectedExecutionHandler來處理

重點講解:
其中比較容易讓人誤解的是:corePoolSize,maximumPoolSize,workQueue之間關係。

1.當線程池小於corePoolSize時,新提交任務將創建一個新線程執行任務,即使此時線程池中存在空閒線程。
2.當線程池達到corePoolSize時,新提交任務將被放入workQueue中,等待線程池中任務調度執行
3.當workQueue已滿,且maximumPoolSize>corePoolSize時,新提交任務會創建新線程執行任務
4.當提交任務數超過maximumPoolSize時,新提交任務由RejectedExecutionHandler處理
5.當線程池中超過corePoolSize線程,空閒時間達到keepAliveTime時,關閉空閒線程
6.當設置allowCoreThreadTimeOut(true)時,線程池中corePoolSize線程空閒時間達到keepAliveTime也將關閉

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