android線程池ThreadPoolExecutor的理解
線程池
我自己理解看來。
線程池顧名思義就是一個容器的意思,容納的就是ThreadorRunable,
注意:每一個線程都是需要CPU分配資源去執行的。如果由於總是
new Thread()開啟一個線程,那么就會大量的消耗CPU的資源,導致Android運行變慢,甚至OOM(out of memory) ,因而
java就出現了一個ThreadPoolExecutor來管理這些線程。控制最多的線程數maximumPoolSize,
核心線程數corePoolSize,來管理我們需要開啟的線程數。目的:減少了創建和銷毀線程的次數,每個工作線程都可以被重復利用,可執行多個任務
所以:我們就可以根據手機的CPU核數來控制
App可以開的最大線程數。保證程序的合理運行
創建線程池對象
線程池幾個參數的理解:
比如去火車站買票, 有10個售票窗口, 但只有5個窗口對外開放. 那么對外開放的5個窗口稱為核心線程數
corePoolSize,而最大線程數
maximumPoolSize是10個窗口.如果5個窗口都被占用, 那么后來的人就必須在后面排隊, 但后來售票廳人越來越多, 已經人滿為患, 就類似於線程隊列
new LinkedBlockingQueue<Runnable>()已滿.- 這時候火車站站長下令, 把剩下的5個窗口也打開, 也就是目前已經有10個窗口同時運行. 后來又來了一批人,
- 10個窗口也處理不過來了, 而且售票廳人已經滿了, 這時候站長就下令封鎖入口,不允許其他人再進來, 這就是線程異常處理策略.
- 而線程存活時間
keepAliveTime指的是, 允許售票員休息的最長時間, 以此限制售票員偷懶的行時間。休息一下在處理。
單列的模式創建線程池ThreadPoolExecutor
public static class ThreadPool
{
public static ThreadPoolExecutor executor = null;
private int corePoolSize;
private int maximumPoolSize;
private long keepAliveTime = 0; // 限制線程的的最大存活時間
public ThreadPool(int corePoolSize, int maximumPoolSize, long keepAliveTime)
{
super();
this.corePoolSize = corePoolSize; //核心線程數
this.maximumPoolSize = maximumPoolSize; //最大線程 ,當核心線程用完時。決定是否開啟最大線程
this.keepAliveTime = keepAliveTime; //線程排隊時間,
}
/**
* 線程池:就是把一堆線程放在一起來管理。 1.通過一定的管理機制。來處理線程額執行順序 2.管理最多可以同時執行的線程數。
* 3.其他線程通過隊列的形式,也就是排隊的形式來管理線程的並發數。
*
* @param runnable
*/
public void execute(Runnable runnable)
{
if (runnable == null)
{
return;
}
if (executor == null)
{
executor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime,
TimeUnit.MILLISECONDS,// 時間單位
new LinkedBlockingQueue<Runnable>(),// 線程隊列
Executors.defaultThreadFactory(),//線程工廠
new AbortPolicy());
}
// 給線程池里面添加一個線程
executor.execute(runnable);
}
創建線程池管理者 ThreadManager
通過給線程加鎖機制。來保證線程安全,以及當前程序當中只有一個x線程池
ThreadPool
/**
* 線程管理者。
*
* @author H_lang
*
*/
public class ThreadManager
{
private static ThreadPool threadPool; // 單列的線程池對象。
/**
* 單列,線程安全
* 獲取一個線程池對象
* @return
*/
public static ThreadPool getThreadPool()
{
if (threadPool == null)
{
//枷鎖
synchronized (ThreadManager.class)
{
if (threadPool == null)
{
//核心線程數,等於處理器個數乘2
int corePoolSize = Runtime.getRuntime().availableProcessors()*2;
int maximumPoolSize = 10;
long keepAliveTime = 0L;
threadPool = new ThreadPool(corePoolSize, maximumPoolSize, keepAliveTime);
}
}
}
return threadPool;
}
public static class ThreadPool
{
public static ThreadPoolExecutor executor = null;
private int corePoolSize;
private int maximumPoolSize;
private long keepAliveTime = 0; // 限制線程的的最大存活時間
public ThreadPool(int corePoolSize, int maximumPoolSize, long keepAliveTime)
{
super();
this.corePoolSize = corePoolSize; //核心線程數
this.maximumPoolSize = maximumPoolSize; //最大線程 ,當核心線程用完時。決定是否開啟最大線程
this.keepAliveTime = keepAliveTime; //線程排隊時間,
}
/**
* 線程池:就是把一堆線程放在一起來管理。 1.通過一定的管理機制。來處理線程額執行順序 2.管理最多可以同時執行的線程數。
* 3.其他線程通過隊列的形式,也就是排隊的形式來管理線程的並發數。
*
* @param runnable
*/
public void execute(Runnable runnable)
{
if (runnable == null)
{
return;
}
if (executor == null)
{
executor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime,
TimeUnit.MILLISECONDS,// 時間單位
new LinkedBlockingQueue<Runnable>(),// 線程隊列
Executors.defaultThreadFactory(),//線程工廠
new AbortPolicy());
}
// 給線程池里面添加一個線程
executor.execute(runnable);
}
}
}
