android線程池原理和實現

多線程的管理一直是android開發的一項核心技術,合理的利用線程池管理線程可以大大提高app的性能,下面我們來看看在android中線程池的使用

關於線程池的理解,概念性的東西本文就不再闡述,不理解的地方可以私信,

在android中,管理線程池主要用到了java.util.concurrent.ThreadPoolExecutor這個類,該類的官方文檔(有牆)。該類的父類是ExecutorService,

該類中有幾個重要的參數概念:

1 :Core and maximum pool sizes: 其中Core指的是該線程池被創建時,線程池中線程的個數,maximum 指的是線程池中最大線程個數,這兩個是有區別的,區別在於Core是線程池正常工作時候線程池的個數,maximum 指的是線程池在高負荷(線程池任務排滿)的情況下,線程池的線程數.

2 Keep-alive times  顧名思義,該參數指的是線程池在空閒的時候存在的時間,當線程池空閒時,並不需要馬上銷燬,而是把線程池掛起來,這樣就能減少CPU和內存創建線程池的消耗.

3 Queuing :當線程池的任務比較多時,線程池就會把一些任務放在一個隊列中進行排隊等待.

說了那麼多概念,接下來就來寫一段代碼吧,首先創建一個單例線程池管理類管理線程池

ThreadManager.class,該類中有一個內部類用來創建線程池
ThreadPoolProxy.class
重寫該類的構造方法:
public ThreadPoolProxy(int corePoolSize,int maxcorePoolSize,long time ){
    this.corePoolSize=corePoolSize;
    this.maxcorePoolSize=maxcorePoolSize;
    this.time=time;
}
其中,corePoolSize指的是線程池線程個數,maxcorePoolSize指的是最大線程數,time指的是存活時間,單位ms
在該類中寫一個execute方法:
public void  execute(Runnable runnable){
    if (pool==null){
        //創建一個線程池
        pool=new ThreadPoolExecutor(corePoolSize,maxcorePoolSize
        ,time, TimeUnit.MINUTES,new LinkedBlockingDeque<Runnable>(10));
    }
    pool.execute(runnable);
}

其中pool是ThreadPoolExecutor對象,在創建對象時將corePoolSize(線程數),maxcorePoolSize(最大線程數)
time(存活時間),TimeUnit.MINUTES(時間單位),new LinkedBlockingDeque<Runnable>(10)(排隊等待執行任務的隊列,最大爲10個任務);
pool.execute(runnable);執行任務
有創建當然就有取消了:
public void  cance(Runnable runnable){
    if (pool!=null&&!pool.isShutdown()&&!pool.isTerminated()){
        //判斷線程池是否爲空,線程池是否崩潰,是否已經停止
        pool.remove(runnable);
    }
}
ThreadPoolProxy類中初始化ThreadPoolProxy內部類:
public synchr,onized ThreadPoolProxy creatCPUPool(){
    int cpus=Runtime.getRuntime().availableProcessors();
    Log.e("TAG","設備cpu數爲:"+String.valueOf(cpus));
    int threadnumber=2*cpus+1;
    Log.e("TAG","最佳線程數爲:"+String.valueOf(threadnumber));
    if (threadCPUPoolProxy==null){
        threadCPUPoolProxy=new ThreadPoolProxy(threadnumber,threadnumber,6000L);
    }
    return threadCPUPoolProxy;
}
注意,ThreadPoolProxy並不需要重複創建,過多創建線程池容易發生資源泄露,因此我們只需要創建一次,線程池的線程數理論上應該滿足2*CPU核心數+1的時候性能最佳。
最後,只需要在要使用到多線程的地方這麼做就行
ThreadManager.getInstance().creatCPUPool().execute(new Runnable() {
    @Override
    public void run() {
        //要執行的內容
    }
});


工具類地址:http://download.csdn.net/detail/qq_25817651/9600788





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