java Executors工具類的相關方法使用創建
通過Executors類創建線程池
線程池的創建方式有很多種,可以通過Executors工具類創建多種模式的線程池,Executors工具類位於java.util.concurrent.locks包中,接下來解釋其中的方法。
首先將線程池的七個參數標在這裡: corePoolSize:表示線程池中核心線程的數量;
maximumPoolSize:表示線程池中最大線程數量;
keepAliveTime:針對救急線程的存活時間的變量,就是當線程數量超過線程池中的核心數量時,如果沒有新的任務被提交,那麼核心線程外的救急線程就會保持在keepAliveTime變量值之後被銷毀,而不是立即銷毀;
unit:也是針對救急線程,表示keepAliveTime的核心單位;
workQueue:表示線程池中的阻塞隊列,阻塞隊列中存儲著等待執行的任務;
threadFactory:表示用來創建線程的線程工廠。創建線程池的時候,默認的線程工廠創建的線程具有相同的優先級,可以為線程起一個好名字;
handler:表示線程池的拒絕策略。當線程池中的阻塞隊列滿瞭的時候,線程數maximumPoolSize也達到瞭最大值,如果此時再有任務提交到線程池,線程池就會采取策略來拒絕任務的執行。
🎆newCachedThreadPool方法
調用Executors工具類的newCachedThreadPool方法可以創建一個可緩存的線程池,核心線程數為0,當線程池中的線程數量超過瞭運行任務所需要的線程數,那麼可以回收空閑的線程,默認每60s回收;同時當任務增加的時候,線程池又可以創建新的線程來處理任務。
public static ExecutorService newCachedThreadPool() { return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>()); } public static ExecutorService newCachedThreadPool(ThreadFactory threadFactory) { return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>(), threadFactory); }
🎊newFixThreadPool方法
調用Executors工具類的newFixThreadPool方法可以創建一個固定長度大小的線程池,線程池中的線程都是核心線程,也就是創建的線程池中的線程數量是固定的,能夠控制線程池的最大並發數。
當向線程池提交任務時,如果線程池中有空閑的線程則會直接執行任務,如果沒有空閑線程則會將任務放入阻塞隊列中等待,有空閑線程的時候再去執行阻塞隊列中的線程。
當線程池達到最大線程數時,線程數量會保持不變,一旦某個線程出現異常,線程池會補充一個線程。提交到線程池的任務過多可能會導致內存溢出。
public static ExecutorService newFixedThreadPool(int nThreads, ThreadFactory threadFactory) { return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(), threadFactory); }
🎍newScheduledThreadPool方法
調用Executors工具類的newScheduledThreadPool方法可以創建一個可以周期性執行任務的線程池,也能夠定時執行任務。
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) { return new ScheduledThreadPoolExecutor(corePoolSize); } public static ScheduledExecutorService newScheduledThreadPool( int corePoolSize, ThreadFactory threadFactory) { return new ScheduledThreadPoolExecutor(corePoolSize, threadFactory); }
🎠newSingleThreadExecutor方法
調用Executors工具類的newSingleThreadExecutor方法可以創建隻有一個工作線程的線程池,相當於隻有一個線程在工作。能夠保證任務按照先進先出的順序,或者優先級順序執行任務。就像單線程在串行執行任務一樣,但是也有些區別,如果這個唯一的線程出現瞭異常,線程池會創建一個新的線程來代替它。
public static ExecutorService newSingleThreadExecutor(ThreadFactory threadFactory) { return new FinalizableDelegatedExecutorService (new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(), threadFactory)); }
🎡newSingleThreadScheduledExecutor方法
調用Executors工具類的newSingleThreadScheduledExecutor方法可以創建隻有一個工作線程,並且支持定時,周期性執行任務的線程池。
public static ScheduledExecutorService newSingleThreadScheduledExecutor(ThreadFactory threadFactory) { return new DelegatedScheduledExecutorService (new ScheduledThreadPoolExecutor(1, threadFactory)); }
🎁newWorkStealingPool方法
調用Executors工具類的newSingleThreadExecutor方法可以創建一個具有並行級別的線程池,這是jdk 1.8新增的方法,可以為線程池設置並行級別,通過使用多個隊列來減少競爭,需要傳遞一個並行級別的參數。
public static ExecutorService newWorkStealingPool(int parallelism) { return new ForkJoinPool (parallelism, ForkJoinPool.defaultForkJoinWorkerThreadFactory, null, true); }
以上就是java Executors工具類的相關方法使用創建的詳細內容,更多關於java Executors工具類的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- 淺談為什麼阿裡巴巴要禁用Executors創建線程池
- Java 線程池全面總結與詳解
- Java並發編程之Executors類詳解
- 一篇文章帶你瞭解Java中ThreadPool線程池
- Java並發編程面試之線程池