<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Java線程池的使用及工作原理

          共 6016字,需瀏覽 13分鐘

           ·

          2021-08-12 11:21

          關(guān)注我們,設(shè)為星標(biāo),每天7:30不見不散,架構(gòu)路上與您共享 

          回復(fù)"架構(gòu)師"獲取資源

          前言

          在日常開發(fā)過程中總是以單線程的思維去編碼,沒有考慮到在多線程狀態(tài)下的運行狀況。由此引發(fā)的結(jié)果就是請求過多,應(yīng)用無法響應(yīng)。為了解決請求過多的問題,又衍生出了線程池的概念。通過“池”的思想,從而合理的處理請求。本文記錄了Java中線程池的使用及工作原理,如有錯誤,歡迎指正。

          什么是線程池?

          線程池是一種用于實現(xiàn)計算機(jī)程序并發(fā)執(zhí)行的軟件設(shè)計模式。線程池維護(hù)多個線程,等待由調(diào)度程序分配任務(wù)以并發(fā)執(zhí)行,該模型提高了性能,并避免了由于為短期任務(wù)頻繁創(chuàng)建和銷毀線程而導(dǎo)致的執(zhí)行延遲。

          線程池要解決什么問題?

          說到線程池就一定要從線程的生命周期講起。

          從圖中可以了解無論任務(wù)執(zhí)行多久,每個線程都要經(jīng)歷從生到死的狀態(tài)。而使用線程池就是為了避免線程的重復(fù)創(chuàng)建,從而節(jié)省了線程的NewRunnable, RunningTerminated的時間;同時也會復(fù)用線程,最小化的節(jié)省系統(tǒng)資源,于此同時提高了響應(yīng)速度。

          線程池的使用

          線程池的創(chuàng)建

          使用ThreadPoolExecutor并配置7個參數(shù)完成線程池的創(chuàng)建

          public ThreadPoolExecutor(int corePoolSize,
                                        int maximumPoolSize,
                                        long keepAliveTime,
                                        TimeUnit unit,
                                        BlockingQueue<Runnable> workQueue,
                                        ThreadFactory threadFactory,
                                        RejectedExecutionHandler handler)

          • corePoolSize:線程池中核心線程的最大值

          • maximumPoolSize:線程池中最大線程數(shù)

          • keepAliveTime:非核心線程空閑的存活時間大小

          • unit:keepAliveTime的單位,常用的有秒、分鐘、小時等

          • workQueue:阻塞隊列類型

          • threadFactory:線程工廠,用于配置線程的名稱,是否為守護(hù)線程等

          • handler:線程池的拒絕策略

          常用阻塞隊列

          ArrayBlockingQueue

          底層基于數(shù)組的實現(xiàn)的有界阻塞隊列

          LinkedBlockingQueue

          底層基于單鏈表的阻塞隊列,可配置容量,不配置容量默認(rèn)為Integer.MAX_VALUE

          線程工廠

          在《阿里巴巴Java開發(fā)手冊》中強(qiáng)制要求指定線程的名稱

          由于工作是使用hutool比較多,里面也包含對ThreadFactory的封裝,可以很方便的指定名稱

          ThreadFactory threadFactory = ThreadFactoryBuilder.create().setNamePrefix("myThread-").build();

          拒絕策略

          當(dāng)線程池內(nèi)工作線程數(shù)大于maximumPoolSize時,線程就不再接受任務(wù),執(zhí)行對應(yīng)的拒絕策略;目前支持的拒絕策略有四種:

          1. AbortPolicy(默認(rèn)):丟棄任務(wù)并拋出RejectedExecutionException異常

          2. CallerRunsPolicy:由調(diào)用者處理

          3. DiscardOldestPolicy:丟棄隊列中最前面的任務(wù),并重新入隊列

          4. DiscardPolicy:丟棄任務(wù)但不拋出異常

          線程池的執(zhí)行邏輯

          // 創(chuàng)建線程工廠
          ThreadFactory threadFactory = ThreadFactoryBuilder.create().setNamePrefix("myThread-").build();
          // 創(chuàng)建線程池
          ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(5, 10, 10, TimeUnit.SECONDS, new ArrayBlockingQueue<>(100), threadFactory, new ThreadPoolExecutor.AbortPolicy());

          execute()方法

          // 組合值;保存了線程池的工作狀態(tài)和工作線程數(shù)
          private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0));

              public void execute(Runnable command) {
               // 任務(wù)為空 拋出NPE
                  if (command == null)
                      throw new NullPointerException();
                  // 獲取線程池狀態(tài)
                  int c = ctl.get();
                  // 如果工作線程數(shù)小于核心線程數(shù)就創(chuàng)建新線程
                  if (workerCountOf(c) < corePoolSize) {
                      if (addWorker(commandtrue))
                          return;
                      c = ctl.get();
                  }
                  // 如果線程池處于Running狀態(tài),就把任務(wù)放在隊列尾部
                  if (isRunning(c) && workQueue.offer(command)) {
                      // 重新檢查線程池狀態(tài)
                      int recheck = ctl.get();
                      // 如果線程池不是Running狀態(tài),就移除剛才添加的任務(wù),并執(zhí)行拒絕策略
                      if (! isRunning(recheck) && remove(command))
                          reject(command);
                      // 是Running狀態(tài),就添加線程
                      else if (workerCountOf(recheck) == 0)
                          addWorker(null, false);
                  }
                  // 添加任務(wù)失敗,執(zhí)行拒絕策略
                  else if (!addWorker(commandfalse))
                      reject(command);
              }
          // addWorker()完成線程的創(chuàng)建

          執(zhí)行流程


          文章來源:https://blog.csdn.net/lhc_makefunny/article/details/117308066



          到此文章就結(jié)束了。如果今天的文章對你在進(jìn)階架構(gòu)師的路上有新的啟發(fā)和進(jìn)步,歡迎轉(zhuǎn)發(fā)給更多人。歡迎加入架構(gòu)師社區(qū)技術(shù)交流群,眾多大咖帶你進(jìn)階架構(gòu)師,在后臺回復(fù)“加群”即可入群。







          這些年小編給你分享過的干貨

          1.SpringBoot物流管理項目,拿去學(xué)習(xí)吧(附源碼)

          2.ERP系統(tǒng),自帶進(jìn)銷存+財務(wù)+生產(chǎn)功能,拿來即用(附源碼)

          3.帶工作流的SpringBoot后臺管理項目快速開發(fā)(附源碼)
          4.最好的OA系統(tǒng),拿來即用,非常方便(附源碼)

          5.SpringBoot+Vue完整的外賣系統(tǒng),手機(jī)端和后臺管理,附源碼!

          6.SpringBoot+Vue 可視化拖拽編輯的大屏項目(附源碼)

          轉(zhuǎn)發(fā)在看就是最大的支持??

          瀏覽 43
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  日本中文久草视频在线 | 影音先锋日韩 | 俺也去了大香蕉在线 | 毛片中文字幕 | 无码在线免费一区 |