在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也將關閉