Java創建線程池的方法


Executors創建四種線程池:

CachedThreadPool:可緩存的線程池,該線程池中沒有核心線程,非核心線程的數量為Integer.max_value,當有需要時創建線程來執行任務,沒有需要時回收線程,適用於耗時少,任務量大的情況。

ScheduledThreadPool:周期性執行任務的線程池,按照某種特定的計划執行線程中的任務,有核心線程,但也有非核心線程,非核心線程的大小也為無限大。適用於執行周期性的任務。

SingleThreadPool:只有一條線程來執行任務,適用於有順序的任務的應用場景。

FixedThreadPool:定長的線程池,有核心線程,核心線程的即為最大的線程數量。

創建方式

public class ThreadPoolDemo {
    public static void main(String[] args) {
        Executors.newFixedThreadPool(3);
        Executors.newCachedThreadPool();
        Executors.newScheduledThreadPool(3);
        Executors.newSingleThreadExecutor();
    }
}

實際開發中采用ThreadPoolExecutor創建線程池:

原因:

  • FixedThreadPool和SingleThreadExecutor => 允許的請求隊列長度為Integer.MAX_VALUE,可能會堆積大量的請求,從而引起OOM異常
  • CachedThreadPool => 允許創建的線程數為Integer.MAX_VALUE,可能會創建大量的線程,從而引起OOM異常

創建方式

    public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue,
                              ThreadFactory threadFactory,
                              RejectedExecutionHandler handler)

ThreadPoolExecutor參數說明:

corePoolSize : 線程池核心池的大小

maximumPoolSize : 線程池的最大線程數

keepAliveTime :線程最大空閑時間

unit : 時間單位

workQueue : 用來儲存等待執行任務的隊列

threadFactory : 線程工廠

handler :拒絕策略

四種拒絕策略

當提交任務數大於 corePoolSize 的時候,會優先將任務放到 workQueue 阻塞隊列中。當阻塞隊列飽和后,會擴充線程池中線程數,直到達到 maximumPoolSize 最大線程數配置。此時,再多余的任務,則會觸發線程池的拒絕策略了。

  • AbortPolicy - 丟棄任務,並拋出拒絕執行 RejectedExecutionException 異常信息。線程池默認的拒絕策略。必須處理好拋出的異常,否則會打斷當前的執行流程,影響后續的任務執行。
  • CallerRunsPolicy-由調用者線程執行
  • DiscardPolicy - 直接丟棄
  • DiscardOldestPolicy - 當觸發拒絕策略,只要線程池沒有關閉的話,丟棄阻塞隊列 workQueue 中最老的一個任務,並將新任務加入


免責聲明!

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



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