1.簡介
1)定義:Fork/Join是一個并行計算框架,它的任務模型是分治--》具體來講植锉,指的是把一個復雜的問題分解成多個相似的子問題辫樱,然后再把子問題分解成更小的子問題,直到子問題簡單到可以直接求解
2)擴展:我們java提供的工具本質上是讓我們把心思放在任務上汽煮,而不是放在線程的協作上搏熄,那常見的任務模型,除了分治暇赤,還有簡單并行,聚合宵凌,批量并行鞋囊!
3)分治任務模型:
2.具體說明
1)類圖--》其實ForkJoinPoll和ForkJoinTask類似于ThreadPoolExecutor和Runnable之間的關系!
2)工作原理
ForkJoinPool與普通線程池不同瞎惫,ThreadPoolExecutor內部只有一個任務隊列溜腐,而ForkJoinPool內部有多個任務隊列,當我們通過ForkJoinPool的invoke()或者submit()方法提交任務時瓜喇,ForkJoinPool根據一定的路由規(guī)則把任務提交到一個任務隊列中挺益,如果任務在執(zhí)行過程中會創(chuàng)建出子任務,那么子任務會提交到工作線程對應的任務隊列中乘寒。
3)亮點
竊取機制:它為了保證每個隊列均勻的被線程獲取望众,所以提供了,指的是當前我的隊列為空的時候,我就可以向別的隊列去竊取任務烂翰,放到自己的隊列夯缺!當然,這些隊列都是雙端隊列甘耿,從不同的端切取踊兜,一定程度減少了沖突!
4)問題:代碼倆次fork會出現性能下降的問題:---》因為當前的線程如果fork倆次佳恬,就相當于指揮倆個任務去執(zhí)行任務捏境,但是當前線程就會陷入等待中,從而導致性能下降? ? 詳情---》https://www.liaoxuefeng.com/article/001493522711597674607c7f4f346628a76145477e2ff82000
5)代碼案例:
3.應用場景
1)統計單詞數量
2)歸并排序
3)阿里面試的數據類題目