日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

面试被问线程池,真香

發布時間:2025/3/16 编程问答 10 豆豆
生活随笔 收集整理的這篇文章主要介紹了 面试被问线程池,真香 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

面試官 : ? 看你簡歷上寫了對系統性能做了優化,能簡單給我介紹一下嗎?都有哪些優化,你是怎么衡量優化效果的?

: ?巴拉巴拉。。。例如我們系統之前要查詢用戶的個人身份信息、聯系人信息、訂單狀態信息、積分信息,之前系統是單線程串行處理的,我用線程池對四個任務并行處理,然后對處理結果合并。

面試官 : ? 你剛才說用到線程池,能跟我講講為什么用線程池嗎?我創建四個線程處理可不可以?

: ? 可以,當然可以。

擺手

: ? 但是用線程池更合適。阿里巴巴開發規約中有一條:

3.【強制】線程資源必須通過線程池提供,不允許在應用中自行顯式創建線程。
說明:使用線程池的好處是減少在創建和銷毀線程上所消耗的時間以及系統資源的開銷,解決資源不足的問題。如果不使用線程池,有可能造成系統創建大量同類線程而導致消耗完內存或者“過度切換”的問題。
《阿里巴巴研發手冊》

: ?就像你去餐廳吃飯,服務員總是提前洗好盤子,不會等你來打飯的時候才洗盤子,盤子就像是線程池里的線程,你打飯就是要處理的任務。

面試官 : ?那你知道線程池的相關類關系嗎?

: ? 這算什么問題?不應該是問我核心線程數怎么設置嗎?好吧。。。請看下圖:

  • Executor 的定義非常簡單,就定義了線程池最本質要做的事,執行任務。

public?interface?Executor?{void?execute(Runnable?command); }
  • ExecutorService 也是個接口,不過他算是把線程池的框架搭出來了,告訴要實現它的線程池必須提供的一些管理線程池的方法。

  • AbstractExecutorService 是普通的線程池執行器,ScheduledExecutorService 是定時任務線程池。

面試官 : ?那你日常開發中是怎么創建線程池的?

: ?我用ThreadPoolExecutor 自定義創建線程池。

面試官 : ?那你知道線程池都有哪些核心參數嗎?

: ?線程池主要的核心參數有7個,我們看 ThreadPoolExecutor ?構造函數就知道了

  • corePoolSize :核心線程數

  • maximumPoolSize: 最大線程數

  • keepAliveTime :線程在線程池中不被銷毀的空閑時間,如果線程池的線程太多,任務比較小,到這個時間就銷毀線程池。

    unit : keepAliveTime 的時間單位,一般設置成秒或毫秒。

  • workQueue : 任務隊列,存放等待執行的任務

  • threadFactory: 創建線程的任務工廠,比如給線程命名加上前綴,后面會講

  • handler : 拒絕任務處理器,當任務處理不過來時的拒絕處理器

  • allowCoreThreadTimeOut : 是否允許核心線程超時銷毀,這個參數不在構造函數中,但重要性也很高

  • 面試官 : 老實說,你是不是來之前背過了,不然怎么可能都記住了。

    : ? [掀桌子],不面了,還找什么工作,要什么自行車。

    面試官 : ?其實剛才那也是問題,考察面試者是否皮實,我們繼續。。

    面試官 : ?剛才說了這些核心參數,你能不能跟我講講線程池的基本工作原理。

    : 可以的,這里我給你畫個流程,如下所示:

    面試官 : ?那按照上面的流程寫段偽代碼。

    : ?還能不能好好面了,讓手撕線程池。

    那好吧,你對著????????的流程圖看,代碼如下:

    面試官 : ?不錯,那你平常怎么管理線程池的呢?

    : ?我會搞了個線程池管理器,比如 ThreadPoolManager,有個私有變量的Map,按照線程池的作用給他取個名字,比如起名為: preparePlateThreadPool (準備餐盤線程池),把線程池名稱定義成常量,和創建好的線程池放到管理器的Map里。

    面試官 : ?除了你自己用 ThreadPoolExecutor 創建線程池,還有別的方式嗎?

    : ?java.util.concurrent 包里提供的 Executors 也可以用來創建線程池。

    面試官 : ? Executors 定義了哪幾種 ?

    :

    • newSingleThreadExecutos ? 單線程線程池,也就是線程池只有一個任務,這個我偶爾用一用

    • newFixedThreadPool(int nThreads) ?固定大小線程的線程池

    • newCachedThreadPool() ? 無界線程池,這個就是無論多少任務,都創建線程來運行,所以隊列相當于沒用。

    面試官 : ?你上面講日常開發自己 用 ThreadPoolExecutor 創建線程池,為什么不用Executors ?提供的。

    : ?第一是 Executors 提供的線程池使用場景很有限,一般場景很難用到,第二他們也都是通過 ThreadPoolExecutor 創建的線程池,我直接用 ThreadPoolExecutor 創建線程池,可以理解原理,靈活度更高。

    參考阿里開發手冊規約:

    4.【強制】線程池不允許使用Executors去創建,而是通過ThreadPoolExecutor的方式,這樣的處理方式讓寫的同學更加明確線程池的運行規則,規避資源耗盡的風險。
    說明:Executors返回的線程池對象的弊端如下:
    1)FixedThreadPool和SingleThreadPool:
    ??允許的請求隊列長度為Integer.MAX_VALUE,可能會堆積大量的請求,從而導致OOM。
    2)CachedThreadPool:
    ??允許的創建線程數量為Integer.MAX_VALUE,可能會創建大量的線程,從而導致OOM。

    《阿里巴巴研發手冊》

    面試官 : ?前面你代碼里有任務入隊的操作,你一般自定義線程池,用的什么隊列?

    : ?這個要看實際應用的。

  • 有的任務在早上8點和晚上6點都是高峰期,因此有任務尖刺,用 LinkedBlockingQueue, 這個是無界隊列,不限制任務大小的。

  • 對于重要性沒那么高,非強依賴的任務用的ArrayBlockingQueue,這個是指定大小的,如果任務超出,會創建非核心線程執行任務。

  • 面試官 : ? 那你怎么保證任務隊列的可用性呢?

    : ?分幾個方面:

  • 我的線程池管理器,會有一個定時任務,定時檢測Map 中線程池當前任務隊列的狀態,會設置一個 waterThreshold(水位線),超出水位線會有告警;

  • 日常大促演練,會對線程池做壓測,如果發生超水位情況,還會對線程按線程名做降級,動態調整核心線程數和隊列,當然還有限流、降級等其他有段保障。

  • 面試官 : ?那你怎么合理拆分線程池,核心任務數和任務隊列大小的呢?

    : ?這個是個老生常談的問題。

    【推薦】 了解每個服務大致的平均耗時,可以通過獨立線程池配置,將較慢的服務與主線程池隔離開,不致于各服務線程同歸于盡。

    《阿里巴巴研發手冊》

  • 按照任務的類型,對任務做拆分,分成不同的線程池,分別命名;

  • 區分任務的類型,是CPU密集型還是IO密集型,CPU 可以設置約為CPU核心數,上下文切換少,io密集型可以設置的大一些。

  • 大體估算一個,然后做壓測,評估,另外線程池有個變量也可以參考意義:largestPoolSize,線程池達到過的最大線程任務,比如你剛開始可以把線程數設置的足夠大,壓測過后看這個參數達到的最大數值,同時參考系統的性能指標,cou、io、mem等。

  • 這里還有個公式借鑒:最佳線程數目 = ((線程等待時間+線程CPU時間)/線程CPU時間 )* CPU數目

  • 也有開源的輔助測算線程池的合理線程數。

  • 面試官 : ?那拒絕策略呢?了解嗎

    : ?拒絕策略就是當任務太多,超過maximumPoolSize了,只能拒絕。

    面試官 : ?詳細講講

    : ?拒絕的時候可以指定拒絕策略,也可以自己實現,JDK默認提供了四種拒絕策略.

    • AbortPolicy

      默認拒絕策略, 直接拋RejectedExecutionException

    • DiscardPolicy

      任務直接丟棄,不拋出異常

    • CallerRunsPolicy

      由調用者來執行被拒絕的任務,比如主線程調用線程池的submit提交任務,但是任務被拒絕,則主線程直接執行。

      但是線程池如果已經被關閉了,任務就被丟棄了。

      public?void?rejectedExecution(Runnable?r,?ThreadPoolExecutor?e)?{ //線程池沒關閉 if?(!e.isShutdown())?{ //直接run,沒有讓線程池來執行r.run(); } }
    • DiscardOldestPolicy

      丟棄隊列里等的最久的任務,然后嘗試執行被拒絕的任務。

      但是線程池如果已經被關閉了,任務就被丟棄了

      public?void?rejectedExecution(Runnable?r,?ThreadPoolExecutor?e)?{ if?(!e.isShutdown())?{//丟棄隊列頭部任務e.getQueue().poll();//線程池嘗試執行任務e.execute(r); } }

    面試官 : ?那這幾種拒絕策略,你選哪一種?

    : ? 我選拒絕回答

    面試官 : ? 我選你回去等通知。

    有道無術,術可成;有術無道,止于術

    歡迎大家關注Java之道公眾號

    好文章,我在看??

    總結

    以上是生活随笔為你收集整理的面试被问线程池,真香的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 成年人网站在线观看视频 | 亚洲综合99 | 亚洲黄片一区二区 | 中文字幕在线观看的网站 | 欧美黑人粗大 | 一个人看的视频www 色就是色网站 | 丁香花电影高清在线阅读免费 | 国产精品国产三级国产 | 色偷偷网站 | 成人精品电影 | xxx69美国| 色婷婷av一区二区三区软件 | 97精品国产97久久久久久春色 | 18禁裸男晨勃露j毛免费观看 | 手机av在线不卡 | 美女涩涩网站 | 中文字幕免费在线观看 | 国产精品欧美精品 | 免费亚洲视频 | 天天视频亚洲 | 91福利区| 少妇把腿扒开让我舔18 | 久久久久人妻一区精品色欧美 | 特色特色大片在线 | 欧美精品乱码久久久久久按摩 | 91精品国产一区二区无码 | 97人妻精品一区二区三区动漫 | 国产资源在线免费观看 | 久久久久久片 | 天天综合久久 | 国产在线播放91 | 久久视频在线观看免费 | 最近中文字幕在线中文高清版 | 最新版天堂资源在线 | 美女黄18以下禁止观看 | 香蕉视频国产 | 欧美黄色激情 | 天天做天天摸天天爽天天爱 | 在线精品自拍 | 91在线在线 | 久久久久久一 | 无码人妻丰满熟妇啪啪 | 成年人晚上看的视频 | 免费爱爱网站 | 亚洲最大福利 | 女同性恋一区二区三区 | 成人免费看高清电影在线观看 | 国产综合色视频 | 久久不卡视频 | 大尺度av | 欧美a在线播放 | 久热免费视频 | 成人欧美精品 | 最新毛片基地 | 免费啪视频在线观看 | 一区三区在线 | 高清不卡av| 男人看的网站 | 国产精品乱码久久久久久 | 亚洲精品鲁一鲁一区二区三区 | 伊人一区二区三区四区 | 久久久国产精华液 | 一区二区三区国产在线 | 久久精品成人一区二区三区蜜臀 | 亚洲精品aaa | xxxx 国产| 色av网| 欧美激情影音先锋 | 久久五月天综合 | 女人免费视频 | 国产特级av | 校园春色av | 91精品国产高清91久久久久久 | 青青草官网 | 国产亚洲片 | 欧美一区二区成人 | 久久a毛片 | 人乳喂奶hd无中字 | 这里都是精品 | 日产国产亚洲精品系列 | 久久精品成人一区二区三区蜜臀 | 在线黄色av | 伊人久久97 | 在线观看国产日韩 | 亚洲暴爽 | 亚洲高清免费观看 | 亚洲免费一级片 | 成人一区三区 | 免费亚洲网站 | 看全色黄大色黄大片女一次牛 | 亚洲av综合色区无码二区爱av | 国内自拍偷拍 | 免费一级特黄 | a免费视频 | 色香蕉视频 | 中文字幕69 | 欧美一级一区二区 | 1级片在线观看 | 国产精品一品 |