<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、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                ## 一、線程池的作用 1. 防止資源占用無限的擴張 2. 調用過程省去資源的創建和銷毀所占用的時間 在上一節中,我們的一個異步任務打開了一個線程,完成后銷毀。在高并發環境下,不斷的分配新資源,可能導致系統資源耗盡。所以為了避免這個問題,我們為異步任務規劃一個線程池。 ## 二、定義線程池 在上述操作中,創建一個**線程池配置類**`TaskConfiguration`,并配置一個**任務線程池對象**`taskExecutor`。 ~~~ @Configuration public class TaskConfiguration { @Bean("taskExecutor") public Executor taskExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setCorePoolSize(10); executor.setMaxPoolSize(20); executor.setQueueCapacity(200); executor.setKeepAliveSeconds(60); executor.setThreadNamePrefix("taskExecutor-"); executor.setRejectedExecutionHandler(new CallerRunsPolicy()); return executor; } } ~~~ 上面我們通過使用`ThreadPoolTaskExecutor`創建了一個**線程池**,同時設置了以下這些參數: | 線程池屬性 | 屬性的作用 | 設置初始值 | | --- | --- | --- | | 核心線程數 | 線程池創建時候初始化的線程數 | 10 | | 最大線程數 | 線程池最大的線程數,只有在緩沖隊列滿了之后,才會申請超過核心線程數的線程 | 20 | | 緩沖隊列 | 用來緩沖執行任務的隊列 | 200 | | 允許線程的空閑時間 | 當超過了核心線程之外的線程,在空閑時間到達之后會被銷毀 | 60秒 | | 線程池名的前綴 | 可以用于定位處理任務所在的線程池 | taskExecutor- | | 線程池對拒絕任務的處理策略 | 這里采用CallerRunsPolicy策略,當線程池沒有處理能力的時候,該策略會直接在execute方法的調用線程中運行被拒絕的任務;如果執行程序已關閉,則會丟棄該任務 | CallerRunsPolicy | * 在`AsyncCallBackTask `類,三個任務的配置`@Async`注解需要指定前面配置的**線程池的名稱**`taskExecutor`。達到加入線程池控制目的,并添加打印當前線程代碼: ![](https://img.kancloud.cn/e4/53/e4530fee7d1f0566088d7c399f09d6e9_1010x299.png) ~~~ @Component public class AsyncCallBackTask extends AbstractTask { @Async("taskExecutor") public Future<String> doTaskOneCallback() throws Exception { super.doTaskOne(); System.out.println("任務一,當前線程:" + Thread.currentThread().getName()); return new AsyncResult<>("任務一完成"); } @Async("taskExecutor") public Future<String> doTaskTwoCallback() throws Exception { super.doTaskTwo(); System.out.println("任務二,當前線程:" + Thread.currentThread().getName()); return new AsyncResult<>("任務二完成"); } @Async("taskExecutor") public Future<String> doTaskThreeCallback() throws Exception { super.doTaskThree(); System.out.println("任務三,當前線程:" + Thread.currentThread().getName()); return new AsyncResult<>("任務三完成"); } } ~~~ 執行**單元測試**,可以看到如下結果: ![](https://img.kancloud.cn/9b/de/9bdeaa7076413158135cbe6e720a606e_1078x618.png) ~~~ 開始做任務一 開始做任務三 開始做任務二 完成任務二,耗時:3905毫秒 任務二,當前線程:taskExecutor-2 完成任務一,耗時:6184毫秒 任務一,當前線程:taskExecutor-1 完成任務三,耗時:9737毫秒 任務三,當前線程:taskExecutor-3 ~~~ ![](https://img.kancloud.cn/5b/de/5bde5608007daeaefa7fbd241f861877_550x438.png) 執行上面的單元測試,觀察到**任務線程池**的**線程池名的前綴**被打印,說明**線程池**成功執行**異步任務**! ## 三、優雅地關閉線程池 > 由于在應用關閉的時候異步任務還在執行,導致類似**數據庫連接池**這樣的對象一并被**銷毀了**,當**異步任務**中對**數據庫**進行操作就會出錯。 解決方案如下,重新設置線程池配置對象,新增線程池`setWaitForTasksToCompleteOnShutdown()`和`setAwaitTerminationSeconds()`配置: ~~~ @Bean("taskExecutor") public Executor taskExecutor() { ThreadPoolTaskScheduler executor = new ThreadPoolTaskScheduler(); executor.setPoolSize(20); executor.setThreadNamePrefix("taskExecutor-"); executor.setWaitForTasksToCompleteOnShutdown(true); executor.setAwaitTerminationSeconds(60); return executor; } ~~~ ![](https://img.kancloud.cn/1f/56/1f56afb0b73bb0ce8178f24b525189b0_1139x530.png) * **setWaitForTasksToCompleteOnShutdown(true):**該方法用來設置**線程池關閉**的時候**等待**所有任務都完成后,再繼續**銷毀**其他的`Bean`,這樣這些**異步任務**的**銷毀**就會先于**數據庫連接池對象**的銷毀。 * **setAwaitTerminationSeconds(60):**該方法用來設置線程池中**任務的等待時間**,如果超過這個時間還沒有銷毀就**強制銷毀**,以確保應用最后能夠被關閉,而不是阻塞住。
                  <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>

                              哎呀哎呀视频在线观看