java線程池

線程池可以根據創建時選擇的策略自動處理線程的生命週期。

線程池可以很容易地通過Executors工廠方法來創建。
JDK 中實現 ExecutorService 的類有:
ForkJoinPool,ThreadPoolExecutor、ScheduleThreadPoolExecutor

使用 Executors 類的工程方法來創建 ExecutorService:

  • newCachedThreadPool() :創建一個 ExecutorService,該 ExecutorService 根據需要來創建線程,可以重複利用已存在的線程來執行任務。
  • newFixedThreadPool(int numberOfThreads) :創建一個可重複使用的、固定線程數量的 ExecutorService。
  • newScheduledThreadPool(int corePoolSize):根據時間計劃,延遲給定時間後創建 ExecutorService(或者週期性地創建 ExecutorService)。
  • newSingleThreadExecutor():創建單個工作線程 ExecutorService。
  • newSingleThreadScheduledExecutor():根據時間計劃延遲創建單個工作線程 ExecutorService(或者週期性的創建)。
  • newWorkStealingPool():創建一個擁有多個任務隊列(以便減少連接數)的 ExecutorService。

ExecutorService是一個非常有用的工具,不需要手動創建工作線程。
一個工作線程就是ExecutorService 內部使用的線程。

ExecutorService 管理線程的生命週期。它可以在負載增加的時候增加工作線程。另一方面,在一定週期內,它也可以減少空閒的線程。當我們使用線程池的時候,我們就不再需要考慮線程本身。我們只需要考慮異步處理的任務。

一個任務提交以後,我們可以獲取一個未來結果的抽象——Future,只有提交的任務是一個 Callable 時,Future 纔有意義,因爲 Callable 有輸出結果,而 Runnable 沒有。

每個線程池由幾個模塊組成:

  • 一個任務隊列,
  • 一個工作線程的集合,
  • 一個線程工廠,
  • 管理線程狀態的元數據

如果要手動創建一個ThreadPoolExecutor 類的實例,至少需要5個參數:

  • int corePoolSize:線程池保存的線程數量。
  • int maximumPoolSize:線程的最大數量。
  • long keepAlive and TimeUnit unit:超出 corePoolSize大小後,線程空閒的時間到達給定時間後將會關閉。
  • BlockingQueue workQueue:提交的任務將被放置在該隊列中等待執行。

這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章