標籤:
本文是介紹線程池的基礎篇。
首先介紹一個方法,擷取CPU個數:
int cpuCount = Runtime.getRuntime().availableProcessors();
一、建立非同步線程的弊端。
1、每次new Thread建立對象,導致效能變差。
2、缺乏統一的管理,可能導致無限制的線程運行,嚴重的後果就是OOM 或者死機。
二、啟用線程池的優點。
1、重用性大,減少對象的建立,提高效能。
2、可有效控制並發線程數,提高系統資源使用率,避免資源爭奪。
3、可提供多種功能:定時、迴圈、並發、單一等功能。
三、ExecutorService 線程池
Java通過Executors提供了四類常用的線程池。
1、newCachedThreadPoll
定義一個線程池,當線程池裡面有可複用的線程,重用線程執行,如果沒有,建立線程執行。
2、newSingleThreadExecutor
建立一個線程池,只有唯一的一個活動的背景工作執行緒,有序(FIFO,LIFO,優先順序等順序)的處理隊列中的任務。
ExecutorService singleExecutor = Executors.newSingleThreadExecutor();
for (int i = 0; i < 100; i++) {
singleExecutor.execute(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
}
});
}
3、newFixedThreadPool
定義一個可用並發數的線程池,超過並發數的線程,在隊列裡面等待。
ExecutorService fixedThread = Executors.newFixedThreadPool(3);
for(int i = 0; i < 100 ; i ++){
fixedThread.execute(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
}
});
}
4、newScheduledThreadPool
建立一個定長線程池,支援定時及週期性任務執行。
ScheduledExecutorService scheduledThread = Executors.newScheduledThreadPool(3);
//延時執行
scheduledThread.schedule(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
}
}, 2*1000, TimeUnit.SECONDS);
//固定的間隔執行,不受任何影響
scheduledThread.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
}
}, 10*1000, 1*1000, TimeUnit.SECONDS);
//當線程執行完畢後的,開始計算時間間隔再次執行
scheduledThread.scheduleWithFixedDelay(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
}
}, 10*1000, 1*1000, TimeUnit.SECONDS);
四、AnsyncTask非同步線程
提供兩個線程池:
1、THREAD_POOL_EXECUTOR非同步線程池
2、SERIAL_EXECUTOR同步線程池
注意:
1、當預設使用AsyncTask.execute()執行非同步任務,預設使用SERIAL_EXECUTOR.
2、SERIAL_EXECUTOR是在THREAD_POOL_EXECUTOR基礎上,加一個task的集合來維護順序的。
Android 開發 ThreadPool(線程池) 總結