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

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                [TOC] <br/> > ### 線程池實現原理 ![](https://i.loli.net/2019/03/11/5c85d923986ec.png) ![](https://i.loli.net/2019/03/11/5c85da86c5b37.png) * `ThreadPoolExecutor`執行情況 * 1)如果當前運行的線程少于`corePoolSize`,則創建新線程來執行任務(注意,執行這一步驟需要獲取全局鎖)。 * 2)如果運行的線程等于或多于`corePoolSize`,則將任務加入`BlockingQueue`。 * 3)如果無法將任務加入`BlockingQueue`(隊列已滿),則創建新的線程來處理任務(注意,執行這一步驟需要獲取全局鎖)。 * 4)如果創建新線程將使當前運行的線程超出`maximumPoolSize`,任務將被拒絕,并調用`RejectedExecutionHandler.rejectedExecution()`方法。 <br/> > ### 線程池參數 ``` public ThreadPoolExecutor (int corePoolSize, //核心線程數 int maximumPoolSize, //線程池中允許的最大線程數 long keepAliveTime, //線程池中空閑線程所能允許的最長時間 TimeUnit unit, //時間單位 BlockingQueue<Runnable> workQueue, //任務的阻塞隊列 RejectedExecutionHandler handler) //線程池滿時對于提交任務的策略 ``` <br/> > ### 線程池滿時的拒絕策略`RejectedExecutionHandler ` * `AbortPolicy`:直接拋出異常(默認)。 * `CallerRunsPolicy`:只用調用者所在線程來運行任務。 * `DiscardOldestPolicy`:丟棄隊列里最近的一個任務,并執行當前任務。 * `DiscardPolicy`:不處理,丟棄掉。 <br/> > ### 向線程池提交的任務類型 * `execute()`方法用于提交不需要返回值的任務,所以無法判斷任務是否被線程池執行成功。 * `submit()`方法用于提交需要返回值的任務。線程池會返回一個`future`類型的對象,通過這個`future`對象可以判斷任務是否執行成功,并且可以通過`future`的`get()`方法來獲取返回值,`get()`方法會阻塞當前線程直到任務完成。 <br/> > ### `FixedThreadPool` ``` public static ExecutorService newFixedThreadPool(int nThreads) { return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>()); } ``` * `FixedThreadPool`固定線程數的線程池,`corePoolSize`和`maximumPoolSize`都被設置為創建`FixedThreadPool`時指定的參數`nThreads`。 * 當線程池中的線程數大于`corePoolSize`時,`keepAliveTime`為多余的空閑線程等待新任務的最長時間,超過這個時間后多余的線程將被終止。這里把`keepAliveTime`設置為0L,意味著多余的空閑線程會被立即終止。 * 使用`FixedThreadPool`時,`keepAliveTime`和`RejectedExecutionHandler`均無效。 * `FixedThreadPool`使用無界隊列`LinkedBlockingQueue`作為線程池的工作隊列,注意:當線程池中的線程阻塞時,新任務不斷的添加到無界隊列`LinkedBlockingQueue`中,任務的添加速度大于線程池的處理速度,任務隊列會越來越長,會造成內存被這個隊列撐滿。 ![](https://i.loli.net/2019/03/11/5c85dfb84ea23.png) > ### `SingleThreadExecutor` ``` public static ExecutorService newSingleThreadExecutor() { return new FinalizableDelegatedExecutorService(new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>())); } ``` * `SingleThreadExecutor`是使用單個`worker`線程的`Executor`。 * `SingleThreadExecutor`的`corePoolSize`和`maximumPoolSize`被設置為1。其他參數與`FixedThreadPool`相同。`SingleThreadExecutor`使用無界隊列`LinkedBlockingQueue`作為線程池的工作隊列。 ![](https://i.loli.net/2019/03/11/5c85e98350e00.png) > ### `CachedThreadPool` ``` 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`,即`maximumPool`是無界的。這里把`keepAliveTime`設置為60L,意味著`CachedThreadPool`中的空閑線程等待新任務的最長時間為60秒,空閑線程超過60秒后將會被終止。 * `CachedThreadPool`使用沒有容量的`SynchronousQueue`作為線程池的工作隊列,但`CachedThreadPool`的`maximumPool`是無界的。這意味著,如果主線程提交任務的速度高于`maximumPool`中線程處理任務的速度時,`CachedThreadPool`會不斷創建新線程。極端情況下,`CachedThreadPool`會因為創建過多線程而耗盡CPU和內存資源。 ![](https://i.loli.net/2019/03/11/5c85ea527de2c.png) > ### ` ScheduledThreadPoolExecutor` * `ScheduledThreadPoolExecutor`繼承自`ThreadPoolExecutor`。它主要用來在給定的延遲之后運行任務,或者定期執行任務。 * `DelayQueue`是一個無界隊列 ![](https://i.loli.net/2019/03/11/5c85ebac87ccd.png)
                  <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>

                              哎呀哎呀视频在线观看