<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>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                [TOC] # 常用的幾種線程池 各線程池適應場景總結 1. newFixedThreadPool:創建一個固定大小的線程池,因為采用無界的阻塞隊列,所以實際線程數量永遠不會變化,適用于可以預測線程數量的業務中,或者服務器負載較重,對當前線程數量進行限制 2. newCachedThreadPool:用來創建一個可以無限擴大的回收型線程池,適用于服務器負載較輕,執行很多短期異步任務 3. newWorkStealingPool:創建一個擁有多個任務隊列的線程池,可以減少連接數,創建當前可用cpu數量的線程來并行執行,適用于大耗時的操作,可以并行來執行 4. newScheduledThreadPool:可以延時啟動,定時啟動的線程池,適用于需要多個后臺線程執行周期任務的場景 5. newSingleThreadExecutor:創建一個單線程的,適用于需要保證順序執行各個任務,并且在任意時間點,不會有多個線程是活動的場景 6. newSingleThreadScheduledExecutor:創建一個單線程的,適用于需要保證順序執行各個任務,并且在任意時間點,不會有多個線程是活動的場景,同時可以延時啟動,定時啟動的線程池 ## newCachedThreadPool ### 分析 CachedThreadPool是一個**”無限“容量的線程池**,它會根據需要創建新線程。特點是可以根據需要來創建新的線程執行任務,沒有特定的corePool。下面是它的構造方法 ~~~ public static ExecutorService newCachedThreadPool() { return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>()); } ~~~ CachedThreadPool的corePoolSize被設置為0,即corePool為空;maximumPoolSize被設置為Integer.MAX_VALUE,即maximum是無界的。這里keepAliveTime設置為60秒,意味著空閑的線程最多可以等待任務60秒,否則將被回收。 CachedThreadPool使用沒有容量的SynchronousQueue作為主線程池的工作隊列,它是一個沒有容量的阻塞隊列。每個插入操作必須等待另一個線程的對應移除操作。這意味著,如果主線程提交任務的速度高于線程池中處理任務的速度時,CachedThreadPool會不斷創建新線程。極端情況下,CachedThreadPool會因為創建過多線程而耗盡CPU資源。其運行圖如下: ![](https://box.kancloud.cn/8fe44898eeccb951cba89c6a8b951c23_625x475.png) 執行過程如下: 1. 首先執行SynchronousQueue.offer(Runnable task)。如果在當前的線程池中有空閑的線程正在執行SynchronousQueue.poll(),那么主線程執行的offer操作與空閑線程執行的poll操作配對成功,主線程把任務交給空閑線程執行. execute()方法執行成功,否則執行步驟2 2. 當線程池為空(初始maximumPool為空)或沒有空閑線程時,配對失敗,將沒有線程執行SynchronousQueue.poll操作。這種情況下,線程池會創建一個新的線程執行任務。 3. 在創建完新的線程以后,將會執行poll操作。當步驟2的線程執行完成后,將等待60秒,如果此時主線程提交了一個新任務,那么這個空閑線程將執行新任務,否則被回收。因此長時間不提交任務的CachedThreadPool不會占用系統資源。 SynchronousQueue是一個不存儲元素阻塞隊列,每次要進行offer操作時必須等待poll操作,否則不能繼續添加元素。 ### 代碼實現 創建一個可緩存線程池,如果線程池長度超過處理需要,可靈活回收空閑線程,若無可回收,則新建線程。示例代碼如下: ~~~ //無限容量的線程池 ExecutorService cachedThreadPool = Executors.newCachedThreadPool(); for (int i=0; i<10; i++) { final int index = 1; try{ Thread.sleep(index*1000); }catch (Exception e) { e.printStackTrace(); } cachedThreadPool.execute(new Runnable() { @Override public void run() { System.out.println(index); } }); } //關閉線程池 cachedThreadPool.shutdown(); ~~~ 這種類型的線程池特點是: * 工作線程的創建數量幾乎沒有限制(其實也有限制的,數目為Interger. MAX_VALUE), 這樣可靈活的往線程池中添加線程。 * 如果長時間沒有往線程池中提交任務,即如果工作線程空閑了指定的時間(默認為1分鐘),則該工作線程將自動終止。終止后,如果你又提交了新的任務,則線程池重新創建一個工作線程。 * 在使用CachedThreadPool時,一定要注意控制任務的數量,否則,由于大量線程同時運行,很有會造成系統癱瘓。 ## newFixedThreadPool ### 分析 這個線程池可以創建固定線程數的線程池。特點就是可以**重用固定數量線程**的線程池。它的構造源碼如下: ~~~ public static ExecutorService newFixedThreadPool(int nThreads) { return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>()); } ~~~ * FixedThreadPool的corePoolSize和maxiumPoolSize都被設置為創建FixedThreadPool時指定的參數nThreads。 * 0L則表示當線程池中的線程數量操作核心線程的數量時,多余的線程將被立即停止 * 最后一個參數表示FixedThreadPool使用了無界隊列LinkedBlockingQueue作為線程池的做工隊列,由于是無界的,當線程池的線程數達到corePoolSize后,新任務將在無界隊列中等待,因此線程池的線程數量不會超過corePoolSize,同時maxiumPoolSize也就變成了一個無效的參數,并且運行中的線程池并不會拒絕任務 FixedThreadPool運行圖如下 ![](https://box.kancloud.cn/e0c9faedbcd6d158319452f89518fc27_533x349.png) 執行過程如下: 1. 如果當前工作中的線程數量少于corePool的數量,就創建新的線程來執行任務。 2. 當線程池的工作中的線程數量達到了corePool,則將任務加入LinkedBlockingQueue。 3. 線程執行完1中的任務后會從隊列中去任務。 注意LinkedBlockingQueue是無界隊列,所以可以一直添加新任務到線程池 ### 代碼實現 創建一個定長線程池,可控制線程最大并發數,超出的線程會在隊列中等待。示例代碼如下: ~~~ //創建重用固定數量線程的線程池 ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3); for (int i=0; i<10; i++) { final int index = i; fixedThreadPool.execute(new Runnable() { @Override public void run() { try { System.out.println(index); Thread.sleep(20000); }catch (Exception e) { e.printStackTrace(); } } }); } //關閉線程池 fixedThreadPool.shutdown(); ~~~ 因為線程池大小為3,每個任務輸出index后sleep 2秒,所以每兩秒打印3個數字。 定長線程池的大小最好根據系統資源進行設置 如cpu個數 ~~~ int cpuNums =Runtime.getRuntime().availableProcessors(); ~~~ ## newSingleThreadExecutor ### 分析 SingleThreadExecutor是使用單個worker線程的Executor。特點是使用單個工作線程執行任務。它的構造源碼如下: ~~~ public static ExecutorService newSingleThreadExecutor() { return new FinalizableDelegatedExecutorService (new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>())); } ~~~ SingleThreadExecutor的corePoolSize和maxiumPoolSize都被設置1。 其他參數均與FixedThreadPool相同,其運行圖如下 ![](https://box.kancloud.cn/56d8c4fec05a0b079e2069549cdff73f_626x376.png) 執行過程如下: 1. 如果當前工作中的線程數量少于corePool的數量,就創建一個新的線程來執行任務。 2. 當線程池的工作中的線程數量達到了corePool,則將任務加入LinkedBlockingQueue。 3. 線程執行完1中的任務后會從隊列中去任務。 注意:由于在線程池中只有一個工作線程,所以任務可以按照添加順序執行。 ### 代碼實現 創建一個單線程化的Executor,即只創建唯一的工作者線程來執行任務,它只會用唯一的工作線程來執行任務,保證所有任務按照指定順序(FIFO, LIFO, 優先級)執行。如果這個線程異常結束,會有另一個取代它,保證順序執行。單工作線程最大的特點是可保證順序地執行各個任務,并且在任意給定的時間不會有多個線程是活動的。 ~~~ //單個worker線程的Executor ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor(); for (int i=0; i<10; i++) { final int index = i; singleThreadExecutor.execute(new Runnable() { @Override public void run() { try{ System.out.println(index); Thread.sleep(2000); }catch (Exception e) { e.printStackTrace(); } } }); } //關閉線程池 singleThreadExecutor.shutdown(); ~~~ ## newScheduleThreadPool ### 代碼實現 創建一個定長的線程池,而且支持定時的以及周期性的任務執行,支持定時及周期性任務執行。 延遲3秒執行,延遲執行示例代碼如下: ~~~ ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(5); scheduledExecutorService.schedule(new Runnable() { @Override public void run() { System.out.println("delay 3 seconds"); } }, 3, TimeUnit.SECONDS); ~~~ 表示延遲1秒后每3秒執行一次,定期執行示例代碼如下: ~~~ ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(5); scheduledExecutorService.scheduleAtFixedRate(new Runnable() { @Override public void run() { System.out.println("delay 1 seconds,and excute every 3 seconds"); } }, 1, 3, TimeUnit.SECONDS); ~~~ ## newSingleThreadScheduledExecutor Single Thread Scheduled Pool : 只有一個線程,用來調度執行將來的任務,代碼:`Executors.newSingleThreadScheduledExecutor()` ## newWorkStealingPool ( java 8 ) 創建一個擁有多個任務隊列(以便減少連接數)的線程池,parallelism 參數 可選設置并行級別,默認有 Runtime.getRuntime().availableProcessors() 個線程同時執行
                  <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>

                              哎呀哎呀视频在线观看