Android執行緒池的原理以及專案中實踐

六絃閣主發表於2019-04-18

一.執行緒池使用場景

首先執行緒這個概念就不多講了,相信大家都比較熟悉,一般在處理耗時任務的時候我們習慣
newThread
來建立一個子執行緒去處理,但是當任務多的時候不可能每一個任務都去建立一個任務,會造成系統頻繁的建立和銷燬,佔用大量的資源造成介面的卡頓,甚至可能會出現記憶體異常的問題,所以為了解決這個問題我們需要一個統一管理執行緒的工具
-
執行緒池。使用執行緒池對多工執行緒進行統一管理,對資源進行合理分配,避免不合理的資源佔用,對執行緒進行復用(這個是重點),所謂複用就是執行緒執行完不會立刻銷燬,會等待另外的任務,這樣就不會出現頻繁的建立和銷燬了。

二.執行緒池常用的幾種方式

1.執行緒池的建立先來了解一下基本的構造引數

public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) {
throw new RuntimeException("Stub!");
}

corePoolSize:  執行緒池中核心執行緒數。

maximumPoolSize: 執行緒池中最大執行緒數。

keepAliveTime:非核心執行緒閒置時的超時時長,超過這個時長,非核心執行緒就會被回收

unit:上面時間屬性的單位

workQueue:執行緒池中的任務佇列,通過執行緒池的

execute:方法提交的
Runnable:物件會儲存在這個引數中。

threadFactory:執行緒工廠,可用於設定執行緒名字等等,一般無須設定該引數。

2. Android中的四類執行緒池

2.1 FixThreadPool

FixThreadPool只有核心執行緒,且數量固定,不會被回收,執行緒都在執行時後面的任務會被等待

建構函式

public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}

執行示例

public void excuteFixThreadPool()
{
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);
fixedThreadPool.execute(runnable);
}

2.2 SingleThreadPool

SingleThreadPool只有一個核心執行緒,所有任務都在同一執行緒中按順序執行,先進先出

建構函式

public static ExecutorService newSingleThreadExecutor(ThreadFactory threadFactory) {
return new FinalizableDelegatedExecutorService
(new ThreadPoolExecutor(1, 1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>(),
threadFactory));
}

執行示例

public void excuteSingleThreadPool()
{
ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
singleThreadExecutor.execute(runnable);
}

2.3 CachedThreadPool

CachedThreadPool沒有核心執行緒,只有費核心執行緒,新任務會建立新執行緒,執行緒空閒超過指定時間會被回收,比較適合執行大量的耗時較少的任務。

建構函式

public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());
}

執行示例

public void excuteCachedThreadPool()
{
ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
cachedThreadPool.execute(runnable);
}

2.4 ScheduledThreadPool

從字面上看大概就知道是執行定時任務的執行緒管理,核心執行緒數固定,非核心執行緒(閒著沒活幹會被立即回收)數沒有限制。

建構函式

public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {
return new ScheduledThreadPoolExecutor(corePoolSize);
}

執行示例

public void excuteScheduledThreadPool ()
{
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);
scheduledThreadPool.schedule(runnable, 1, TimeUnit.SECONDS); //延遲1s後執行任務

}

三.個人專案中的需求以及利用執行緒池實現的過程

我個人在專案中有一個需求就是在第一次進入主介面時需要在服務端同時拉多份資料儲存在本地,且資料都是比較大比較耗時的任務,如果一個一個執行需要等待較長時間,使用者體驗實在較差,所以採用執行緒池進行管理,同時執行多個任務,由執行緒池進行管理,這樣任務處理是並行的,等待時間較短,使用者體驗提升。


相關文章