轉載: http://blog.csdn.net/weihan1314/article/details/7983725
使用場景:多線程一直是一個程序健壯性的基礎條件,在實現複雜業務邏輯的時候往往需要使用多線程來完成業務邏輯操作。然而線程的創建與銷燬是一個耗時操作,如果在程序中反覆創建和銷燬線程,將會對程序的反應速度造成嚴重影響,有時甚至會Crash掉程序。因此在需要平凡使用線程的業務場景中,使用線程池是一個不錯的選擇。
本文將爲大家介紹Android線程池的實現方式。在Android中實現線程池,首先需要實現一個線程工廠(ThreadFactory)的子類,具體實現方式如下所示(PriorityThreadFactory.java):
- import android.os.Process;
- /**
- * A thread factory that create threads with a given thread priority
- * @author jony
- * @version 1.0
- */
- public class PriorityThreadFactory implements ThreadFactory{
- private final String mName;
- private final int mPriority;
- private final AtomicInteger mNumber = new AtomicInteger();
- public PriorityThreadFactory(String name, int priority) {
- mName = name;// 線程池的名稱
- mPriority = priority;//線程池的優先級
- }
- @Override
- public Thread newThread(Runnable r) {
- return new Thread(r, mName +"-"+mNumber.getAndIncrement()){
- @Override
- public void run() {
- // 設置線程的優先級
- Process.setThreadPriority(mPriority);
- super.run();
- }
- };
- }
- }
以上是創建線程池的一個工具類,接下來爲大家介紹本篇文章的重點,線程池的實現方式,具體實現方式如下所示(MyThreadPool.java):
- package com.tcl.actionbar;
- import java.util.concurrent.ThreadFactory;
- import java.util.concurrent.atomic.AtomicInteger;
- package com.tcl.actionbar;
- import java.util.concurrent.BlockingQueue;
- import java.util.concurrent.Executor;
- import java.util.concurrent.LinkedBlockingDeque;
- import java.util.concurrent.ThreadPoolExecutor;
- import java.util.concurrent.TimeUnit;
- import java.util.concurrent.ThreadFactory;
- // 線程池的實現方式
- public class MyThreadPool {
- private final static int POOL_SIZE = 4;// 線程池的大小最好設置成爲CUP核數的2N
- private final static int MAX_POOL_SIZE = 6;// 設置線程池的最大線程數
- private final static int KEEP_ALIVE_TIME = 4;// 設置線程的存活時間
- private final Executor mExecutor;
- public MyThreadPool() {
- // 創建線程池工廠
- ThreadFactory factory = new PriorityThreadFactory("thread-pool", android.os.Process.THREAD_PRIORITY_BACKGROUND);
- // 創建工作隊列
- BlockingQueue<Runnable> workQueue = new LinkedBlockingDeque<Runnable>();
- mExecutor = new ThreadPoolExecutor(POOL_SIZE, MAX_POOL_SIZE, KEEP_ALIVE_TIME, TimeUnit.SECONDS, workQueue, factory);
- }
- // 在線程池中執行線程
- public void submit(Runnable command){
- mExecutor.execute(command);
- }
- }
代碼中的註釋已經詳細講解了線程池的實現方式,在此不再傲述。
如果大家仔細研究代碼的話,就會發現一個問題,只要創建了線程池,只要程序已啓動,使用線程池的時候,線程池就會立即創建設定的線程最小個數,這樣的話就會導致線程池的驚羣現象(如果的我的業務邏輯現在只使用一個線程,那麼其他線程資源就會白白浪費)。
使用Android系統創建的線程池,線程的數目不會因爲線程的使用數目減少,而將線程池的整體數目減少。也就是說只要線程池一旦創建,線程池中線程的最小數目就是我們創建線程池時設置的最小數目。這樣會導致兩個問題:
一是線程池驚羣現象;二是CUP資源浪費;
針對以上問題,我的解決方案是透徹分析業務邏輯,設定合理的線程數目。對於線程池的驚羣現象,目前還沒有很好的解決方案……
如果大家有更好解決以上兩個問題的方法,歡迎大家留言,共同探討!