1、newCachedThreadPool
1.1.作用:創建一個可根據需要創建新線程的線程池,但是在以前構造的線程可用時將重用它們,並在需要時使用提供的 ThreadFactory 創建新線程。
1.2.特征:
(1)線程池中數量沒有固定,可達到最大值(Interger. MAX_VALUE)
(2)線程池中的線程可進行緩存重復利用和回收(回收默認時間為1分鍾)
(3)當線程池中,沒有可用線程,會重新創建一個線程
1.3.創建方式:
ExecutorService pool = Executors.newSingleThreadExecutor();
一個單線程的線程池。這個線程池只有一個線程在工作,也就是相當於單線程串行執行所有任務。如果這個唯一的線程因為異常結束,那么會有一個新的線程來替代它。此線程池保證所有任務的執行順序按照任務的提交順序執行。
使用方式:
import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class ThreadPool { public static void main(String[] args) { ExecutorService pool = Executors.newSingleThreadExecutor(); for (int i = 0; i < 10; i++) { pool.execute(() -> { System.out.println(Thread.currentThread().getName() + "\t開始發車啦...."); }); } } }
輸出結果如下:
pool-1-thread-1 開始發車啦.... pool-1-thread-1 開始發車啦.... pool-1-thread-1 開始發車啦.... pool-1-thread-1 開始發車啦.... pool-1-thread-1 開始發車啦.... pool-1-thread-1 開始發車啦.... pool-1-thread-1 開始發車啦.... pool-1-thread-1 開始發車啦.... pool-1-thread-1 開始發車啦.... pool-1-thread-1 開始發車啦....
從輸出的結果我們可以看出,一直只有一個線程在運行。
2、newFixedThreadPool
2.1.作用:創建一個可重用固定線程數的線程池,以共享的無界隊列方式來運行這些線程。在任意點,在大多數 nThreads 線程會處於處理任務的活動狀態。如果在所有線程處於活動狀態時提交附加任務,則在有可用線程之前,附加任務將在隊列中等待。如果在關閉前的執行期間由於失敗而導致任何線程終止,那么一個新線程將代替它執行后續的任務(如果需要)。在某個線程被顯式地關閉之前,池中的線程將一直存在。
2.2.特征:
(1)線程池中的線程處於一定的量,可以很好的控制線程的並發量
(2)線程可以重復被使用,在顯示關閉之前,都將一直存在
(3)超出一定量的線程被提交時候需在隊列中等待
2.3.創建方式:
(1)Executors.newFixedThreadPool(int nThreads);//nThreads為線程的數量
(2)Executors.newFixedThreadPool(int nThreads,ThreadFactory threadFactory);//nThreads為線程的數量,threadFactory創建線程的工廠方式
ExecutorService pool = Executors.newFixedThreadPool(10);
創建固定大小的線程池。每次提交一個任務就創建一個線程,直到線程達到線程池的最大大小。線程池的大小一旦達到最大值就會保持不變,如果某個線程因為執行異常而結束,那么線程池會補充一個新線程。
使用方式:
import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class ThreadPool { public static void main(String[] args) { ExecutorService pool = Executors.newFixedThreadPool(10); for (int i = 0; i < 10; i++) { pool.execute(() -> { System.out.println(Thread.currentThread().getName() + "\t開始發車啦...."); }); } } }
輸出結果如下:
pool-1-thread-1 開始發車啦.... pool-1-thread-4 開始發車啦.... pool-1-thread-3 開始發車啦.... pool-1-thread-2 開始發車啦.... pool-1-thread-6 開始發車啦.... pool-1-thread-7 開始發車啦.... pool-1-thread-5 開始發車啦.... pool-1-thread-8 開始發車啦.... pool-1-thread-9 開始發車啦.... pool-1-thread-10 開始發車啦....
3、newSingleThreadExecutor
3.1.作用:創建一個使用單個 worker 線程的 Executor,以無界隊列方式來運行該線程。(注意,如果因為在關閉前的執行期間出現失敗而終止了此單個線程,那么如果需要,一個新線程將代替它執行后續的任務)。可保證順序地執行各個任務,並且在任意給定的時間不會有多個線程是活動的。與其他等效的 newFixedThreadPool(1) 不同,可保證無需重新配置此方法所返回的執行程序即可使用其他的線程。
3.2.特征:
(1)線程池中最多執行1個線程,之后提交的線程活動將會排在隊列中以此執行
3.3.創建方式:
(1)Executors.newSingleThreadExecutor() ;
(2)Executors.newSingleThreadExecutor(ThreadFactory threadFactory);// threadFactory創建線程的工廠方式
創建方式:
ExecutorService pool = Executors.newCachedThreadPool();
創建一個可緩存的線程池。如果線程池的大小超過了處理任務所需要的線程,那么就會回收部分空閑的線程,當任務數增加時,此線程池又添加新線程來處理任務。
使用方式如上2所示。
4、newScheduleThreadPool
4.1.作用: 創建一個線程池,它可安排在給定延遲后運行命令或者定期地執行。
4.2.特征:
(1)線程池中具有指定數量的線程,即便是空線程也將保留
(2)可定時或者延遲執行線程活動
4.3.創建方式:
(1)Executors.newScheduledThreadPool(int corePoolSize);// corePoolSize線程的個數
(2)newScheduledThreadPool(int corePoolSize, ThreadFactory threadFactory);// corePoolSize線程的個數,threadFactory創建線程的工廠
創建方式:
ScheduledExecutorService pool = Executors.newScheduledThreadPool(10);
此線程池支持定時以及周期性執行任務的需求。
使用方式:
import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; public class ThreadPool { public static void main(String[] args) { ScheduledExecutorService pool = Executors.newScheduledThreadPool(10); for (int i = 0; i < 10; i++) { pool.schedule(() -> { System.out.println(Thread.currentThread().getName() + "\t開始發車啦...."); }, 10, TimeUnit.SECONDS); } } }
上面演示的是延遲10秒執行任務,如果想要執行周期性的任務可以用下面的方式,每秒執行一次
//pool.scheduleWithFixedDelay也可以 pool.scheduleAtFixedRate(() -> { System.out.println(Thread.currentThread().getName() + "\t開始發車啦...."); }, 1, 1, TimeUnit.SECONDS);
5、newSingleThreadScheduledExecutor
作用: 創建一個單線程執行程序,它可安排在給定延遲后運行命令或者定期地執行。
特征:
(1)線程池中最多執行1個線程,之后提交的線程活動將會排在隊列中以此執行
(2)可定時或者延遲執行線程活動
創建方式:
(1)Executors.newSingleThreadScheduledExecutor() ;
(2)Executors.newSingleThreadScheduledExecutor(ThreadFactory threadFactory) ;//threadFactory創建線程的工廠
6.五種線程池的使用場景
-
newSingleThreadExecutor:一個單線程的線程池,可以用於需要保證順序執行的場景,並且只有一個線程在執行。
-
newFixedThreadPool:一個固定大小的線程池,可以用於已知並發壓力的情況下,對線程數做限制。
-
newCachedThreadPool:一個可以無限擴大的線程池,比較適合處理執行時間比較小的任務。
-
newScheduledThreadPool:可以延時啟動,定時啟動的線程池,適用於需要多個后台線程執行周期任務的場景。
-
newWorkStealingPool:一個擁有多個任務隊列的線程池,可以減少連接數,創建當前可用cpu數量的線程來並行執行。
7.線程池任務執行流程
- 當線程池小於corePoolSize時,新提交任務將創建一個新線程執行任務,即使此時線程池中存在空閑線程。
- 當線程池達到corePoolSize時,新提交任務將被放入workQueue中,等待線程池中任務調度執行
- 當workQueue已滿,且maximumPoolSize>corePoolSize時,新提交任務會創建新線程執行任務
- 當提交任務數超過maximumPoolSize時,新提交任務由RejectedExecutionHandler處理
- 當線程池中超過corePoolSize線程,空閑時間達到keepAliveTime時,關閉空閑線程
- 當設置allowCoreThreadTimeOut(true)時,線程池中corePoolSize線程空閑時間達到keepAliveTime也將關閉
參考資料:https://blog.csdn.net/admin1973/article/details/80451498