Executors執行緒池
阿新 • • 發佈:2019-07-26
/**
* Executors的好處:可建立固定數量執行緒的執行緒池,並可以重用執行緒池中的執行緒,減少建立物件, 銷燬物件,節省資源
* 並且支援執行緒定時,中斷操作,可控制併發的執行緒數量
* 而new Thread,在呼叫run方法後,如果裡面的任務執行完畢, 則這個執行緒會自動關閉了,如果下次還想用
* 則需要再次new Thread,重新建立, 不斷建立的話, 會佔用較多的資源,可能會造成oom,而且 每個執行緒不易於統一管理
*/
public class ThreadPoolUtils {
private ScheduledExecutorService scheduledExecutorService;
private ExecutorService fixedThreadPool;
/*--------------------------定時執行緒------------------------------------------------------------------*/
/**
* 開啟固定數量執行緒的執行緒池
* 也支援開啟定時的執行緒池
* 這裡就傳 1, 模擬只支援一個執行緒的執行緒池
* @param runnable
* @param start 開始幾秒後執行第一次
* @param delay 第一次之後,每次間隔時間delay後,執行下一次
* 預設使用秒
*/
public void startTimerPool(Runnable runnable,long start,long delay){
scheduledExecutorService = Executors.newScheduledThreadPool(1);
scheduledExecutorService.scheduleWithFixedDelay(runnable,start,delay, TimeUnit.SECONDS);
}
/**
* 關閉定時的執行緒池
*/
public void stopTimerPool(){
scheduledExecutorService.shutdown();
scheduledExecutorService = null;
}
/*------------------------------------快取執行緒,儘量少用--------------------------------------------------------*/
/**
* 建立快取執行緒池,如果第一個執行緒任務完成, 則第二個執行緒會複用第一個執行緒,不會開啟新執行緒,若第一個沒完成,則第二個開啟新執行緒去做
* 超過60s沒用的執行緒 會預設銷燬
* 適用於大流量但是週期短的非同步處理
*
* 容易出現OOM,因為執行緒量大,每個執行緒佔用內容多,就會出現oom
* 1w個執行緒,每個執行緒佔1M,這就是10G,但是電腦是8G的,就oom了
*
* 這種執行緒池 能少用就少用
*/
public void startCachePool(Runnable... runnables){
if (null == runnables)return;
ExecutorService executorService = Executors.newCachedThreadPool();
for (int i=0;i<runnables.length;i++){
executorService.execute(runnables[i]);
}
}
/*------------------------------------固定執行緒數量的執行緒池---------------------------------------------------*/
/**
* 建立定長的執行緒數的執行緒池,執行緒數量可控制的併發
* 超過規定的併發量 就排隊等著
* 和CachedThreadPool不同,她的執行緒不會自動銷燬
*
* @param poolSize 執行緒的數量
*/
public void startFixedPool(int poolSize,Runnable... runnable){
fixedThreadPool = Executors.newFixedThreadPool(poolSize);
for (int i = 0;i<runnable.length;i++){
fixedThreadPool.execute(runnable[i]);
}
}
/**
* 關閉執行緒池
*/
public void stopFixedPool(){
if (null == fixedThreadPool)return;
fixedThreadPool.shutdown();
fixedThreadPool = null;
}
/*------------------------------------單一執行緒數量的執行緒池---------------------------------------------------*/
/**
* 建立唯一的執行緒來執行,任務順序執行,一個執行完後執行下一個
* @param runnable
*/
public void startSinglePool(Runnable runnable){
ExecutorService executorService = Executors.newSingleThreadExecutor();
executorService.execute(runnable);
}
}