一.執行緒池使用場景
二.執行緒池常用的幾種方式
1.執行緒池的建立先來了解一下基本的構造引數
public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) {
throw new RuntimeException("Stub!");
}
corePoolSize: 執行緒池中核心執行緒數。
maximumPoolSize: 執行緒池中最大執行緒數。
keepAliveTime:非核心執行緒閒置時的超時時長,超過這個時長,非核心執行緒就會被回收
unit:上面時間屬性的單位
workQueue:執行緒池中的任務佇列,通過執行緒池的
execute:方法提交的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後執行任務