五種線程池的分類和作用


 


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.線程池任務執行流程

  1. 當線程池小於corePoolSize時,新提交任務將創建一個新線程執行任務,即使此時線程池中存在空閑線程。
  2. 當線程池達到corePoolSize時,新提交任務將被放入workQueue中,等待線程池中任務調度執行
  3. 當workQueue已滿,且maximumPoolSize>corePoolSize時,新提交任務會創建新線程執行任務
  4. 當提交任務數超過maximumPoolSize時,新提交任務由RejectedExecutionHandler處理
  5. 當線程池中超過corePoolSize線程,空閑時間達到keepAliveTime時,關閉空閑線程
  6. 當設置allowCoreThreadTimeOut(true)時,線程池中corePoolSize線程空閑時間達到keepAliveTime也將關閉

 

參考資料:https://blog.csdn.net/admin1973/article/details/80451498

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM