android線程池ThreadPoolExecutor的理解


android線程池ThreadPoolExecutor的理解

線程池

我自己理解看來。線程池顧名思義就是一個容器的意思,容納的就是ThreadorRunable,
注意:每一個線程都是需要CPU分配資源去執行的。

如果由於總是new Thread()開啟一個線程,那么就會大量的消耗CPU的資源,導致Android運行變慢,甚至OOM(out of memory) ,

因而java就出現了一個ThreadPoolExecutor來管理這些線程。控制最多的線程數maximumPoolSize
核心線程數corePoolSize,來管理我們需要開啟的線程數。

目的:減少了創建和銷毀線程的次數,每個工作線程都可以被重復利用,可執行多個任務

所以:我們就可以根據手機CPU核數來控制App可以開的最大線程數。保證程序的合理運行

創建線程池對象

線程池幾個參數的理解:
  1. 比如去火車站買票, 有10個售票窗口, 但只有5個窗口對外開放. 那么對外開放的5個窗口稱為核心線程數corePoolSize,

  2. 而最大線程數maximumPoolSize是10個窗口.

  3. 如果5個窗口都被占用, 那么后來的人就必須在后面排隊, 但后來售票廳人越來越多, 已經人滿為患, 就類似於線程隊列new LinkedBlockingQueue<Runnable>()已滿.

  4. 這時候火車站站長下令, 把剩下的5個窗口也打開, 也就是目前已經有10個窗口同時運行. 后來又來了一批人,
  5. 10個窗口也處理不過來了, 而且售票廳人已經滿了, 這時候站長就下令封鎖入口,不允許其他人再進來, 這就是線程異常處理策略.
  6. 而線程存活時間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);
}

}
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM