日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

java的線程池有幾種 java線程的創(chuàng)建方式( 六 )


2.4.4 Worker線程執(zhí)行任務
在Worker類中的run方法調(diào)用了runWorker方法來執(zhí)行任務 , runWorker方法的執(zhí)行過程如下:

  1. while循環(huán)不斷地通過getTask()方法獲取任務 。
  2. getTask()方法從阻塞隊列中取任務 。
  3. 如果線程池正在停止 , 那么要保證當前線程是中斷狀態(tài) , 否則要保證當前線程不是中斷狀態(tài) 。
  4. 執(zhí)行任務 。
  5. 如果getTask結(jié)果為null則跳出循環(huán) , 執(zhí)行processWorkerExit()方法 , 銷毀線程 。
執(zhí)行流程如下圖所示:
java的線程池有幾種 java線程的創(chuàng)建方式


圖11 執(zhí)行任務流程
三、線程池在業(yè)務中的實踐3.1 業(yè)務背景
在當今的互聯(lián)網(wǎng)業(yè)界 , 為了最大程度利用CPU的多核性能 , 并行運算的能力是不可或缺的 。通過線程池管理線程獲取并發(fā)性是一個非常基礎(chǔ)的操作 , 讓我們來看兩個典型的使用線程池獲取并發(fā)性的場景 。
場景1:快速響應用戶請求
描述:用戶發(fā)起的實時請求 , 服務追求響應時間 。比如說用戶要查看一個商品的信息 , 那么我們需要將商品維度的一系列信息如商品的價格、優(yōu)惠、庫存、圖片等等聚合起來 , 展示給用戶 。
分析:從用戶體驗角度看 , 這個結(jié)果響應的越快越好 , 如果一個頁面半天都刷不出 , 用戶可能就放棄查看這個商品了 。而面向用戶的功能聚合通常非常復雜 , 伴隨著調(diào)用與調(diào)用之間的級聯(lián)、多級級聯(lián)等情況 , 業(yè)務開發(fā)同學往往會選擇使用線程池這種簡單的方式 , 將調(diào)用封裝成任務并行的執(zhí)行 , 縮短總體響應時間 。另外 , 使用線程池也是有考量的 , 這種場景最重要的就是獲取最大的響應速度去滿足用戶 , 所以應該不設(shè)置隊列去緩沖并發(fā)任務 , 調(diào)高corePoolSize和maxPoolSize去盡可能創(chuàng)造多的線程快速執(zhí)行任務 。
java的線程池有幾種 java線程的創(chuàng)建方式


圖12 并行執(zhí)行任務提升任務響應速度
場景2:快速處理批量任務
描述:離線的大量計算任務 , 需要快速執(zhí)行 。比如說 , 統(tǒng)計某個報表 , 需要計算出全國各個門店中有哪些商品有某種屬性 , 用于后續(xù)營銷策略的分析 , 那么我們需要查詢?nèi)珖虚T店中的所有商品 , 并且記錄具有某屬性的商品 , 然后快速生成報表 。
分析:這種場景需要執(zhí)行大量的任務 , 我們也會希望任務執(zhí)行的越快越好 。這種情況下 , 也應該使用多線程策略 , 并行計算 。但與響應速度優(yōu)先的場景區(qū)別在于 , 這類場景任務量巨大 , 并不需要瞬時的完成 , 而是關(guān)注如何使用有限的資源 , 盡可能在單位時間內(nèi)處理更多的任務 , 也就是吞吐量優(yōu)先的問題 。所以應該設(shè)置隊列去緩沖并發(fā)任務 , 調(diào)整合適的corePoolSize去設(shè)置處理任務的線程數(shù) 。在這里 , 設(shè)置的線程數(shù)過多可能還會引發(fā)線程上下文切換頻繁的問題 , 也會降低處理任務的速度 , 降低吞吐量 。
java的線程池有幾種 java線程的創(chuàng)建方式


圖13 并行執(zhí)行任務提升批量任務執(zhí)行速度
3.2 實際問題及方案思考
線程池使用面臨的核心的問題在于:線程池的參數(shù)并不好配置 。一方面線程池的運行機制不是很好理解 , 配置合理需要強依賴開發(fā)人員的個人經(jīng)驗和知識;另一方面 , 線程池執(zhí)行的情況和任務類型相關(guān)性較大 , IO密集型和CPU密集型的任務運行起來的情況差異非常大 , 這導致業(yè)界并沒有一些成熟的經(jīng)驗策略幫助開發(fā)人員參考 。

推薦閱讀