成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

和阿里P8大佬面試互懟了半小時的Fork/Join原理

開發 前端
線程池、Future、CompletableFuture和CompletionService這些并發工具都是幫助SE站在任務角度解決并發問題,而非糾結于線程之間協作的細節,比如線程之間如何實現等待、通知。

[[396065]]

 只聽到P8大佬不急不慢問道:談談對JDK并發工具的認識?

我開始仔細梳理多年的并發八股文經驗,道:

線程池、Future、CompletableFuture和CompletionService這些并發工具都是幫助SE站在任務角度解決并發問題,而非糾結于線程之間協作的細節,比如線程之間如何實現等待、通知。

  • 簡單并行任務

線程池+Future 組合拳

  • 任務間有聚合關系

AND、OR聚合,CompletableFuture 一招鮮

  • 批量的并行任務

CompletionService 一把梭

并發編程可分為三個層面問題:分工、協作、互斥。

當關注于任務時,你會發現你的視角已躍出并發編程細節,而使用現實世界思維模式,類比現實世界的分工,其實線程池、Future、CompletableFuture和CompletionService都可列為分工問題。

  • 簡單并行任務、聚合任務和批量并行任務的現實的工作流程圖

這三種任務模型,基本覆蓋日常工作中的并發場景,但其實還有一種“分治”任務模型。

分治,分而治之,一種解決復雜問題的思維方法和模式。把一個復雜問題分解成多個相似的子問題,然后再把子問題分解成更小的子問題,直到子問題簡單到可以直接求解。理論上解決每一個問題都對應著一個任務,所以對于問題的分治,實際上就是對于任務的分治。

P8 大佬直接開問,那你說說什么是分治任務模型?

分治任務模型可分為兩個階段:

  • 任務分解

將任務迭代地分解為子任務,直至子任務可計算出結果。將地區具體事務分屬各個地方行政官。

  • 結果合并

逐層合并子任務的執行結果,直至獲得最終結果。各地方行政官最終將治理成果匯報上級。

就像官僚制度一樣:

那你平時開發是如何使用Fork/Join的?

我,我平時還真沒通過啊,就背過。還好這道題,我面試前也準備了…

Fork/Join是一個并行計算框架,以支持分治任務模型

  • Fork對應分治任務模型里的任務分解
  • Join對應結果合并

Fork/Join計算框架主要包含兩部分:

  • 分治任務的線程池ForkJoinPool
  • 分治任務ForkJoinTask

這倆的關系類似于 ThreadPoolExecutor 和 Runnable,都是提交任務到線程池,只不過分治任務有自己獨特的任務類型ForkJoinTask。

ForkJoinTask

JDK7 提供,一個抽象類,核心方法如下:

  • fork()

異步執行一個子任務

  • join()

阻塞當前線程來等待子任務的執行結果

ForkJoinTask有兩個子類——RecursiveAction和RecursiveTask,顯然都是用遞歸處理分治任務。這兩個子類都定義了抽象方法compute():

  • RecursiveAction#compute()無返回值

  • RecursiveTask#compute()有返回值

注意到這倆類都是抽象類,使用要定義子類實現。

只見 P8 開始冷笑,看來要問源碼級別原理了!

那你說下Fork/Join的工作原理

還好我知道阿里面試套路,凡是 java 工具,必問深入的源碼。

因為Fork/Join的核心就是ForkJoinPool,讓我來深入講解ForkJoinPool原理。

ThreadPoolExecutor本質是個生產者-消費者實現,內部有一個任務隊列,作為生產者和消費者的通信媒介。ThreadPoolExecutor可以有多個工作線程,這些工作線程都共享一個任務隊列。

ForkJoinPool本質上也是一個生產者-消費者的實現,但更智能

  • ForkJoinPool工作原理圖

ThreadPoolExecutor內部只有一個任務隊列,而ForkJoinPool內部有多個任務隊列,當調用ForkJoinPool#invoke()或submit()提交任務時,ForkJoinPool把任務通過路由規則提交到一個任務隊列,如果任務在執行過程中會創建出子任務,那么子任務會提交到工作線程對應的任務隊列。

如果工作線程對應的任務隊列空,是不是就沒活兒干了?

No!ForkJoinPool有個“任務竊取”機制,若工作線程空閑了,它會“竊取”其他工作任務隊列里的任務,例如剛才那個圖中,線程T2對應任務隊列已空

那它會“竊取”線程T1對應的任務隊列的任務。這樣所有工作線程都不會閑著。

ForkJoinPool的任務隊列采用的是雙端隊列,工作線程正常獲取任務和“竊取任務”分別從任務隊列不同的端消費,這也能避免很多不必要的數據競爭。

ForkJoinPool支持任務竊取機制,能夠讓所有線程的工作量基本公平,不會出現線程有的很忙,有的一直在摸魚,所以性能很好,是個很公正的領導。

Java8的Stream API里面并行流也是基于ForkJoinPool。

默認,所有的并行流計算都共享一個ForkJoinPool,這個共享的ForkJoinPool的默認線程數是CPU核數;

若所有并行流計算都是CPU密集型,完全沒有問題,但若存在I/O密集型并行流計算,那很可能因為一個很慢的I/O計算而拖慢整個系統的性能。所以建議用不同ForkJoinPool執行不同類型的計算任務。

參考

https://www.liaoxuefeng.com/article/1146802219354112

本文轉載自微信公眾號「JavaEdge」,可以通過以下二維碼關注。轉載本文請聯系JavaEdge公眾號。

 

 

責任編輯:武曉燕 來源: JavaEdge
相關推薦

2020-03-23 08:02:37

阿里工程師能力

2021-09-30 11:58:05

阿里P8雨水

2022-02-16 16:36:55

阿里面試面試流程背景

2021-01-18 08:40:41

年薪阿里團隊

2021-09-13 08:38:42

阿里時間成本

2021-08-20 10:53:21

技術阿里P8

2021-06-07 08:26:35

P8員工公司

2020-01-21 09:51:32

結構化思維互聯網

2020-10-26 11:41:47

kill代碼

2018-08-28 16:22:57

數據庫NoSQLSQL

2019-02-26 12:40:10

程序員架構師阿里

2011-12-27 10:17:56

JDKJava

2017-08-04 11:41:53

Javathreadpool框架

2017-08-07 20:50:27

JavaForkJoin

2020-04-14 10:44:16

阿里安全白帽子

2018-08-07 10:04:11

數據庫分布式緩存Redis

2016-09-23 18:37:06

云計算騰訊云百度云

2013-04-01 10:04:46

2019-10-22 18:00:00

MySQL基礎入門數據庫

2021-10-11 09:19:55

道德阿里專家
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 99久久99久久精品国产片果冰 | 黄视频免费观看 | 韩国精品在线观看 | 成人av播放 | 天天综合网7799精品 | 中文字幕一二三区 | 久久精品色欧美aⅴ一区二区 | 网站黄色在线免费观看 | 91看片网 | 日韩欧美一区二区在线播放 | 国产特级毛片 | 久久精品国产免费一区二区三区 | 中文字幕高清一区 | 91成人在线视频 | 久久99精品久久久 | 久久久91| 亚洲毛片在线观看 | 久久久国产一区二区三区四区小说 | 国精产品一品二品国精在线观看 | 亚洲精品免费视频 | 成人精品国产 | 国产激情片在线观看 | 亚洲精品一区在线观看 | 国产一区二区三区 | 天天看夜夜| 欧美精品在线一区 | 一级片毛片 | 国产一区二区三区四区五区加勒比 | 日韩三级免费观看 | 老司机67194精品线观看 | 一区二区视频 | 国产日韩精品久久 | 国产精品视频免费 | 日韩欧美理论片 | 蜜桃毛片| 黄色网址免费在线观看 | 酒色成人网 | 伊人精品久久久久77777 | 天天干夜夜拍 | 国产精品极品美女在线观看免费 | 尤物在线精品视频 |