<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國際加速解決方案。 廣告
                線程池可以廣泛的應用于同步或者異步處理的場景中,線程池主要的核心思想是能夠幫助我們將`任務的提交`和任務的`執行`分離開來,在JVM的線程和操作系統的線程之間又多封裝了一層(主要用Executor框架實現)。讓開發人員不用顯示的去創建線程(阿里開發手冊就明確說明不能手動創建線程!) 使用線程池帶來的三個好處: 1. 降低資源消耗:可以重復利用創建的線程來執行任務。 2. 提高響應速度:當有大量的任務到達時,可以立刻處理任務,而不用等到線程創建才被執行(并不一定,還是得看具體的線程池的實現細節和任務量)。 3. 提高線程的可管理性。 當向一個線程池提交一個任務(Task)之后,其處理流程如下: ![](https://img.kancloud.cn/69/b8/69b8c6fabcb4c2e5cb9d49808b9090e6_1032x325.png) 主要概念: 1. 核心線程池:在創建線程池的時候會讓我們設置核心線程池中允許的線程數量的大小,線程池優先使用核心線程處理任務。 2. 工作隊列:用來存放要執行的任務,線程池中的線程可以從工作隊列中獲取任務來執行。 3. 飽和策略:當工作隊列和線程池運行的最大線程都已經滿的時候,證明線程池無法再處理更多的任務了,此時需要制定一些策略來對新到來的數據進行處理。 其創建流程如下: 1. 對于一個新添加的任務,當核心線程沒有滿的時候,創建新的核心線程來執行該任務。(會阻塞獲取全局鎖) 2. 當核心線程已滿的時候,將嘗試將任務放入阻塞隊列中。 3. 如果阻塞隊列已滿,如果當前線程池中的線程數還沒有到達最大線程數,則會創建新的線程執行任務。 4. 如果線程數達到最大線程數,則會觸發拒絕策略。根據不同的拒絕策略對任務進行處理。 ### 線程池的創建 Java中使用ThreadPoolExecutor類來表示一個線程池: ```java new ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler ); ``` 參數的含義: 1. corePoolSize:核心線程池的大小,當提交一個任務的時候,核心線程池會創建一個線程來執行任務;即使是核心線程池中有空閑的線程也會創建新的線程,直到任務的數量大于corePoolSize。如果要提前創建所有的線程可以使用:prestartAllCoreThread(); 2. maximunPoolSize:線程池允許的最大線程數量(包括核心線程數)。如果工作隊列已經滿了,并且已經創建的線程數量小于該值,線程池就會創建新的線程對象。`設置了無界的工作隊列,該參數就不起作用了。` 3. keepAliveTime:線程空閑時的存活時間,如果任務時間比較短可以設置大一點。 4. unit:存活時間單位。 5. workQueue:工作隊列,用于保存等待執行的任務的阻塞隊列,所謂阻塞隊列就是獲取或者添加數據的時候可能進行阻塞,有如下幾種可以選擇: * ArrayBlockingQueue:數組結構的`有界`隊列,按照先進先出的方式工作。 * LinkedBlockingQueue:鏈表結構的*無界*隊列(最大值為Integer.MAX\_VALUE),按照先進先出的方式工作,吞吐量要大于ArrayBlockingQueue,Executors.newFixedThreadPool()就是使用這個結構。也可以設定邊界。 * SynchronousQueue:不存儲元素的阻塞隊列,插入操作必須等到另一個線程執行移除操作。吞吐量要大于LinkedBlockingQueue。Executors.newCachedThreadPool使用了這個隊列。 * PriorityBlockingQueue:具有優先級的無限阻塞隊列。 6. threadFactory:用于設置創建線程的工廠,可以讓創建出來的線程的名字更有意義。 7. handler 飽和策略: - AbortPolicy:直接拋出異常; - CallerRunsPolicy:只用調用者所在的線程來運行任務; - DiscardOldPolicy:丟棄隊列里最近一個任務,并執行當前任務; - DiscardPolicy:不處理,丟棄掉。 &nbsp; ### Executor框架 在Java中的線程即是工作單元,也是執行機制,在JDK5.0之后將工作單元和執行機制分離開來。工作單元由Runnable和Callable接口表征,執行機制由Executor框架提供。 Executor框架的結構: 1. 需要執行的任務:由Runnable和Callable接口提供。 2. 任務的執行:由Executor接口的關鍵實現類ThreadPoolExecutor和ScheduledThreadPoolExecutor(即線程池)提供。其中ScheduledThreadPoolExecutor可以在給定的延遲后執行命令,或者定期執行,功能比Timer靈活強大。 3. 異步計算結果:由Future和FutureTask提供。 4. 工廠類:Executors。 通過Executos工具類可以創建三種類型的ThreadPoolExecutor,分別為: 1. 可重用固定線程數的線程池:FixedThreadPool ~~~ ?public static ExecutorService newFixedThreadPool(int nThreads) { ? ? ?return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? new LinkedBlockingQueue<Runnable>()); ?} ~~~ 特點: * 核心線程數和最大線程數相同,為指定的參數nThreads。 * 線程空閑就會被終止。 * 使用LinkedBlockingQueue阻塞無界的阻塞隊列。 * 不用調用拒絕策略(隊列無界)。 2. 使用單個worker線程的線程池:SingleThreadExecutor ~~~ ?public staitc ExecutorService newSingleThreadExecutor() { ? ? ?return new FinalizableDelegatedExecutorService( ? ? new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?new LinkedBlockingQueue<Runnable>())); ?} ~~~ 特點: * 只有一個線程。 * 線程空閑就會被終止。 * 使用LinkedBlockingQueue無界隊列。 * 不會調用拒絕策略。 3. 根據需要創建線程的線程池:CachedThreadPool ~~~ ?public static ExecutorService newCachedThreadPool() { ? ? ?return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? new SynchronousQueue<Runnable>()); ?} ~~~ 特點: * 核心線程數為0,最大線程數為整型的最大值。 * 空閑關閉時間為60s。 * 使用沒有長度的阻塞隊列SynchronousQueue。
                  <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>

                              哎呀哎呀视频在线观看