<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                ## Java線程池概念 顧名思義,管理線程的池子,相比于手工創建、運行線程,使用線程池,有如下優點 * 降低線程創建和銷毀線程造成的開銷 * 提高響應速度。任務到達時,相對于手工創建一個線程,直接從線程池中拿線程,速度肯定快很多 * 提高線程可管理性。線程是稀缺資源,如果無限制地創建,不僅會消耗系統資源,還會降低系統穩定性,使用線程池可以進行統一分配、調優和監控 ## Java線程池創建 無論是創建何種類型線程池(`FixedThreadPool`、`CachedThreadPool`...),均會調用`ThreadPoolExecutor`構造函數,下面詳細解讀各個參數的作用 ``` public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) { this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, Executors.defaultThreadFactory(), defaultHandler); } ``` * **corePoolSize**:核心線程最大數量,通俗點來講就是,線程池中**常駐線程**的最大數量 * **maximumPoolSize**:線程池中運行最大線程數(包括核心線程和非核心線程) * **keepAliveTime**:線程池中空閑線程(僅適用于非核心線程)所能存活的最長時間 * **unit**:存活時間單位,與keepAliveTime搭配使用 * **workQueue**:存放任務的阻塞隊列 * **handler**:線程池飽和策略 ## 線程池執行流程 當提交一個新任務,線程池的處理流程如下: * 判斷線程池中核心線程數是否已達閾值`corePoolSize`,若否,則創建一個新核心線程執行任務 * 若核心線程數已達閾值`corePoolSize`,判斷阻塞隊列`workQueue`是否已滿,若未滿,則將新任務添加進阻塞隊列 * 若滿,再判斷,線程池中線程數是否達到閾值`maximumPoolSize`,若否,則新建一個非核心線程執行任務。若達到閾值,則執行**線程池飽和策略**。 線程池飽和策略分為一下幾種: 1. AbortPolicy:直接拋出一個異常,**默認策略** 2. DiscardPolicy: 直接丟棄任務 3. DiscardOldestPolicy:拋棄下一個將要被執行的任務(**最舊任務**) 4. CallerRunsPolicy:主線程中執行任務 從流程角度,更形象的圖: ![](https://img.kancloud.cn/a7/61/a761e40f1306f34e6f4ab3a08eee00dc_720x290.png) 從結構角度,更形象的圖: ![](https://img.kancloud.cn/ad/fa/adfad43f3d27ff60a67170966bf4bb9b_904x595.png) ## 幾種典型的工作隊列 * **ArrayBlockingQueue**:使用數組實現的有界阻塞隊列,特性**先進先出** * **LinkedBlockingQueue**:使用鏈表實現的阻塞隊列,特性先進先出,可以設置其容量,默認為`Interger.MAX_VALUE`,特性**先進先出** * **PriorityBlockingQueue**:使用平衡二叉樹**堆**,實現的具有**優先級**的無界阻塞隊列 * **DelayQueue**:無界阻塞延遲隊列,隊列中每個元素均有過期時間,當從隊列獲取元素時,只有過期元素才會出隊列。隊列頭元素是最塊要過期的元素。 * **SynchronousQueue**:**一個不存儲元素的阻塞隊列**,每個插入操作,必須等到另一個線程調用移除操作,否則插入操作一直處于阻塞狀態 ## 幾種典型的線程池 1. SingleThreadExecutor ``` public static ExecutorService newSingleThreadExecutor() { return new FinalizableDelegatedExecutorService (new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>())); } ``` 創建單個線程。它適用于需要保證順序地執行各個任務;并且在任意時間點,不會有多個線程是活動的應用場景。 `SingleThreadExecutor`的`corePoolSize`和`maximumPoolSize`被設置為1,使用無界隊列`LinkedBlockingQueue`作為線程池的工作隊列。 ![](https://img.kancloud.cn/80/f0/80f0194c7618c4c62e9358bc82297246_674x342.png) * 當線程池中沒有線程時,會創建一個新線程來執行任務。 * 當前線程池中有一個線程后,將新任務加入`LinkedBlockingQueue` * 線程執行完第一個任務后,會在一個無限循環中反復從`LinkedBlockingQueue`獲取任務來執行。 **使用場景**:適用于串行執行任務場景 2. FixedThreadPool ``` public static ExecutorService newFixedThreadPool(int nThreads, ThreadFactory threadFactory) { return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(), threadFactory); } ``` `corePoolSize`等于`maximumPoolSize`,所以**線程池中只有核心線程**,使用無界阻塞隊列`LinkedBlockingQueue`作為工作隊列 `FixedThreadPool`是一種線程數量固定的線程池,當線程處于空閑狀態時,他們并不會被回收,除非線程池被關閉。當所有的線程都處于活動狀態時,新的任務都會處于等待狀態,直到有線程空閑出來。 ![](https://img.kancloud.cn/63/85/638574c40ab73c6a1fa2e397c9f45435_674x463.png) * 如果當前運行的線程數少于`corePoolSize`,則創建新線程來執行任務。 * 在線程數目達到`corePoolSize`后,將新任務放到`LinkedBlockingQueue`阻塞隊列中。 * 線程執行完(1)中任務后,會在循環中反復從`LinkedBlockingQueue`獲取任務來執行。 **使用場景**:適用于處理CPU密集型的任務,確保CPU在長期被工作線程使用的情況下,盡可能的少的分配線程,即適用執行長期的任務。 3. CachedThreadPool ``` public static ExecutorService newCachedThreadPool() { return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>()); } ``` 核心線程數為0,總線程數量閾值為`Integer.MAX_VALUE`,即**可以創建無限的非核心線程** **執行流程** * 先執行`SynchronousQueue`的`offer`方法提交任務,并查詢線程池中是否有空閑線程來執行`SynchronousQueue`的`poll`方法來移除任務。如果有,則配對成功,將任務交給這個空閑線程 * 否則,配對失敗,創建新的線程去處理任務 * 當線程池中的線程空閑時,會執行`SynchronousQueue`的`poll`方法等待執行`SynchronousQueue`中新提交的任務。若等待超過60s,空閑線程就會終止 流程形象圖 ![](https://img.kancloud.cn/e9/5f/e95f68ff0bfda10fcaf5ea157265a355_832x839.png) ### 結構形象圖 ![](https://img.kancloud.cn/66/41/664185d6cea29311bde346a2dc15ac5f_674x519.png) **使用場景**:**執行大量短生命周期任務**。因為`maximumPoolSize`是無界的,所以提交任務的速度 > 線程池中線程處理任務的速度就要不斷創建新線程;每次提交任務,都會立即有線程去處理,因此`CachedThreadPool`適用于處理大量、耗時少的任務。 4. ScheduledThreadPoolExecutor ``` public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) { return new ScheduledThreadPoolExecutor(corePoolSize); } public ScheduledThreadPoolExecutor(int corePoolSize) { super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS, new DelayedWorkQueue()); } ``` 線程總數閾值為`Integer.MAX_VALUE`,工作隊列使用`DelayedWorkQueue`,非核心線程存活時間為0,所以**線程池僅僅包含固定數目的核心線程。** 兩種方式提交任務: * scheduleAtFixedRate: 按照固定速率周期執行 * scheduleWithFixedDelay:上個任務延遲固定時間后執行 **使用場景**:周期性執行任務,并且需要限制線程數量的場景
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看