Executors線程池工具類

介紹

Executors: 對 ThreadPoolExecutorScheduledThreadPoolExecutor 封裝的工具類,方便建立線程池。java

可是《阿里巴巴Java開發手冊》中有要求:緩存

【強制】線程池不容許使用Executors去建立,而是經過ThreadPoolExecutor的方式,這樣的處理方式讓寫的同窗更加明確線程池的運行規則,規避資源耗盡的風險。

因此不建議使用 Executors 類,直接使用 ThreadPoolExcutor 類有助於咱們更明確底部規則,規避風險。工具

經常使用的幾個方法:

Executors.newFixedThreadPool(int nThreads);

public static ExecutorService newFixedThreadPool(int nThreads) {
    return new ThreadPoolExecutor(nThreads, nThreads,
                                  0L, TimeUnit.MILLISECONDS,
                                  new LinkedBlockingQueue<Runnable>());
}

建立一個有固定線程數的線程池,若是任務數大於了最大線程數,則其它任務將在隊列中排列等待。線程

不過該隊列new LinkedBlockingQueue<Runnable>()的長度爲 Integer.MAX_VALUE,極端狀況下,可能會推積大量請求,從而致使OOM。code

Executors.newSingleThreadExecutor();

public static ExecutorService newSingleThreadExecutor() {
    return new FinalizableDelegatedExecutorService
        (new ThreadPoolExecutor(1, 1,
                                0L, TimeUnit.MILLISECONDS,
                                new LinkedBlockingQueue<Runnable>()));
}

只會建立一條工做線程處理任務,不過該隊列new LinkedBlockingQueue<Runnable>()的長度爲 Integer.MAX_VALUE,極端狀況下,可能會推積大量請求,從而致使OOM。隊列

Executors.newFixedThreadPool(int nThreads) 不徹底同樣,可參考這篇文章《關於SingleThreadExecutor以及FinalizableDelegatedExecutorService》資源

Executors.newCachedThreadPool();

public static ExecutorService newCachedThreadPool() {
    return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                  60L, TimeUnit.SECONDS,
                                  new SynchronousQueue<Runnable>());
}

建立一個有60s緩存的線程池。該線程能夠根據須要智能的建立新的線程,或者重用空閒但未過緩存期的線程。
若是線程池中有超過緩存期的線程(60s不執行任務),該閒置的線程將會被終止並從線程池中移除。開發

不過,該線程池的最大線程數量是 Integer.MAX_VALUE,極端狀況下,可能會推積大量請求,從而致使OOM。get

Executors.newScheduledThreadPool(int corePoolSize);

建立一個支持定時及週期性的任務執行的線程池,多數狀況下可用來替代Timer類。it

不過,該線程池的最大線程數量是 Integer.MAX_VALUE,極端狀況下,可能會推積大量請求,從而致使OOM。

相關文章
相關標籤/搜索