多線程的管理一直是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