首頁>Club>
6
回覆列表
  • 1 # 三僡然

    執行緒池是多執行緒程式設計中的核心概念,簡單地說,它表示可用於執行任務的空閒執行緒的集合。

    首先,讓我們概述多執行緒的參考框架以及為什麼我們可能需要使用執行緒池。

    執行緒是一個執行上下文,可以在一個程序中執行一組指令 - 也就是一個正在執行的程式。多執行緒程式設計是指使用執行緒同時執行多個任務。當然,這種範例在JVM上得到了很好的支援。

    雖然這帶來了幾個優點,主要是關於程式的效能,但多執行緒程式設計也有缺點 - 例如程式碼複雜性增加,併發問題,意外結果以及增加執行緒建立的開銷。

    在本文中,我們將仔細研究如何透過在Java中使用執行緒池來減輕後一個問題。

    為什麼使用執行緒池?

    建立和啟動執行緒可能是一個昂貴的過程。透過每次我們需要執行任務時重複此過程,我們會產生顯著的效能成本 - 這正是我們嘗試透過使用執行緒來改進的。

    為了更好地理解建立和啟動執行緒的成本,讓我們看看JVM在幕後實際做了什麼:

    它為一個執行緒堆疊分配記憶體,該堆疊為每個執行緒方法呼叫儲存一個幀每個幀由區域性變數陣列,返回值,運算元堆疊和常量池組成一些支援本機方法的JVM也會分配本機堆疊每個執行緒都有一個程式計數器,告訴它處理器執行的當前指令是什麼系統建立與Java執行緒對應的本機執行緒與執行緒相關的描述符被新增到JVM內部資料結構中執行緒共享堆和方法區域

    當然,所有這些的細節將取決於JMV和作業系統。

    此外,更多執行緒意味著系統排程程式需要做更多工作來決定接下來哪個執行緒可以訪問資源。

    執行緒池透過減少所需的執行緒數量和管理其生命週期來幫助緩解效能問題。

    本質上,執行緒保留線上程池中直到需要它們為止,之後它們執行任務並返回池以便以後重用。此機制在執行大量小任務的系統中特別有用。

    Java執行緒池

    Java透過稱為執行程式的物件提供自己的執行緒池模式實現。這些可以透過執行程式介面使用,也可以直接透過執行緒池實現使用 - 這樣可以實現更精細的控制。

    在java.util.concurrent包中包含了以下介面:

    Executor - 執行任務的簡單介面ExecutorService - 一個更復雜的介面,包含用於管理任務和執行程式本身的其他方法ScheduledExecutorService - 使用排程任務執行的方法擴充套件ExecutorService

    除了這些介面之外,該包還提供了Executors幫助程式類,用於獲取執行程式例項以及這些介面的實現。

    通常,Java執行緒池由以下內容組成:

    工作執行緒池,負責管理執行緒一個負責建立新執行緒的執行緒工廠等待執行的任務佇列
  • 2 # 淺析架構

    Java中執行緒池主要了解ThreadPoolExecutor。 ThreadPoolExecutor提供了的構造方法的引數含義其實也是基本上面試必問之一。

    public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler) 這些引數的含義原始碼註釋裡面寫的很清楚:

    * @param corePoolSize the number of threads to keep in the pool, even * if they are idle, unless {@code allowCoreThreadTimeOut} is set

    執行緒池維持的執行緒數量,即使他們空閒。也就是說這些執行緒是不會被回收的

    * @param maximumPoolSize the maximum number of threads to allow in the * pool

    執行緒數允許的最大數量。

    * @param keepAliveTime when the number of threads is greater than * the core, this is the maximum time that excess idle threads * will wait for new tasks before terminating.

    超過corePoolSize數量的執行緒,如果在keepAliveTime時間內處於空閒時間,就會被關閉,當然會維持執行緒數值是corePoolSize。

    * @param unit the time unit for the {@code keepAliveTime} argument

    keepAliveTime引數的單位

    * @param workQueue the queue to use for holding tasks before they are * executed. This queue will hold only the {@code Runnable} * tasks submitted by the {@code execute} method.

    在任務執行之前, 使用佇列用來裝載任務。當執行緒數達到核心執行緒數,再有任務來就不會建立執行緒了,而是把任務放到佇列裡,直到佇列滿了,才會建立執行緒直到最大執行緒數。

    * @param threadFactory the factory to use when the executor * creates a new thread

    建立執行緒使用的執行緒工廠類

    * @param handler the handler to use when execution is blocked * because the thread bounds and queue capacities are reached

    當執行緒數量達到執行緒的邊界以及佇列的容量時,也就是說執行緒池滿了,應該怎麼處理這個執行緒,可以透過handler來定義。預設是RejectedExecutionHandler,會丟擲 RejectedExecutionException異常

  • 中秋節和大豐收的關聯?
  • 行星玉米007品種介紹?