1. 程式人生 > >Executors執行緒池

Executors執行緒池

/**
 * 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);
    }
}