Executors: 對 ThreadPoolExecutor
和ScheduledThreadPoolExecutor
封裝的工具類,方便建立線程池。java
可是《阿里巴巴Java開發手冊》中有要求:緩存
【強制】線程池不容許使用Executors去建立,而是經過ThreadPoolExecutor的方式,這樣的處理方式讓寫的同窗更加明確線程池的運行規則,規避資源耗盡的風險。因此不建議使用
Executors
類,直接使用ThreadPoolExcutor
類有助於咱們更明確底部規則,規避風險。工具
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
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》資源
public static ExecutorService newCachedThreadPool() { return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>()); }
建立一個有60s緩存的線程池。該線程能夠根據須要智能的建立新的線程,或者重用空閒但未過緩存期的線程。
若是線程池中有超過緩存期的線程(60s不執行任務),該閒置的線程將會被終止並從線程池中移除。開發
不過,該線程池的最大線程數量是 Integer.MAX_VALUE
,極端狀況下,可能會推積大量請求,從而致使OOM。get
建立一個支持定時及週期性的任務執行的線程池,多數狀況下可用來替代Timer類。it
不過,該線程池的最大線程數量是 Integer.MAX_VALUE
,極端狀況下,可能會推積大量請求,從而致使OOM。