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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

java高并发(十六)J.U.C之ForkJoin

發布時間:2024/9/16 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java高并发(十六)J.U.C之ForkJoin 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

ForkJoin框架是Java7提供的一個用于并行執行任務的框架,是一個把大任務分割成若干個小任務,最終匯總每個小任務結果后得到大任務結果的框架。

與MapReduce思想非常類似。從字面意思上看,Fork就是把一個大任務切割成若干個子任務并行執行,Join就是合并這些子任務的執行結果,最后得到大任務的結果。主要采用工作竊取算法。

? ? 工作竊取算法是指某個線程從其他隊列里竊取任務來執行。下面是工作竊取的流程圖:

為什么要使用工作竊取算法?

? ? 加入我們需要做一個比較大的任務,我們可以把這個任務分割成若干個互不依賴的子任務,為了減少線程間的競爭,于是把這些子任務分別放到不同的隊列里,為每個隊列創建一個單獨的線程來執行隊列里面的任務,線程和隊列一一對應。比如A線程負責處理A隊列里面的任務,但是有些線程會先把自己的隊列里面的任務干完,而其他線程還有對應的任務等待處理,干完活的線程就會幫其他線程干活,于是就會去其他線程的隊列里竊取一個任務來執行,這時他們會訪問同一個隊列,所以為了減少竊取任務線程與被竊取任務線程之間的競爭,通常會使用雙端隊列,被竊取任務的線程永遠從雙端隊列的頭部拿任務執行,而竊取任務的線程永遠從雙端隊列的尾部拿任務執行。這種優點就是充分利用線程進行并行計算,減少了線程間的競爭,缺點是在某些情況下還是存在競爭(比如在雙端隊列只有一個任務時),同時也消耗了更多的系統資源(比如創建了多個線程和多個雙端隊列)。

? ? 對于ForkJoin框架而言,當一個任務正在等待他使用ForkJoin操作創建的子任務結束時,執行這個任務的工作線程查找其他未被執行的任務,并開始他的執行,通過這種方式,線程充分利用他的運行時間來提高應用程序的性能,為了實現這個目標ForkJoin框架執行的任務有一些局限性。

局限性

  • 任務只能使用Fork和Join操作來作為同步機制,如果使用了其他同步機制,那他們在同步操作時工作線程就不能執行其他任務了。比如在forkjoin框架中使任務進入sleep,在睡眠期間內正在執行這個任務的工作線程將不會執行其他任務了。
  • 我們所拆分的任務不應該去執行IO操作。例如讀寫數據文件
  • 任務不能拋出檢查異常。必須通過必要的代碼來處理他們

ForkJoin框架的核心是兩個類:ForkJoinPool和ForkJoinTask。ForkJoinPool負責做實現(包括工作竊取算法)他管理工作線程提供任務的狀態以及他們的執行信息。而ForkJoinTask則主要提供在任務中執行Fork和Join操作的機制。

@Slf4j public class ForkJoinTaskExample extends RecursiveTask<Integer> {public static final int threshold = 2;private int start;private int end;public ForkJoinTaskExample(int start, int end) {this.start = start;this.end = end;}@Overrideprotected Integer compute() {int sum = 0;//如果任務足夠小就計算任務boolean canCompute = (end - start) <= threshold;if (canCompute) {for (int i = start; i <= end; i++) {sum += i;}} else {// 如果任務大于閾值,就分裂成兩個子任務計算int middle = (start + end) / 2;ForkJoinTaskExample leftTask = new ForkJoinTaskExample(start, middle);ForkJoinTaskExample rightTask = new ForkJoinTaskExample(middle + 1, end);// 執行子任務leftTask.fork();rightTask.fork();//等待任務執行結束合并其結果int leftResult = leftTask.join();int rightResult = rightTask.join();// 合并子任務sum = leftResult + rightResult;}return sum;}public static void main(String[] args) {ForkJoinPool forkJoinPool = new ForkJoinPool();//生成一個計算任務,計算1+2+3+4...+100ForkJoinTaskExample taskExample = new ForkJoinTaskExample(1, 100);Future<Integer> result = forkJoinPool.submit(taskExample);try{log.info("result:{}", result.get());} catch (InterruptedException e) {log.error("exception", e);e.printStackTrace();} catch (ExecutionException e) {e.printStackTrace();}} }

?

總結

以上是生活随笔為你收集整理的java高并发(十六)J.U.C之ForkJoin的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 天天操中文字幕 | 国产成人精品免费在线观看 | 国产a级片| 在线中文视频 | 国产高清精品在线 | 欧美性猛交富婆 | 深夜福利网 | 亚洲熟妇无码另类久久久 | 91麻豆精品在线观看 | 有码在线播放 | 精品小视频 | 天天操夜夜摸 | 国产精品变态另类虐交 | 国产精品一区二区久久 | 国产精品一区在线免费观看 | 婷婷资源网 | 日韩伊人久久 | 亚洲一区二区色图 | 欧美人体一区二区 | 少妇15p| 综合久久精品 | 一本色道久久亚洲综合精品蜜桃 | 亚洲久草视频 | 在线麻豆 | 成年男女免费视频网站 | 九九热播视频 | 一区国产精品 | 交专区videossex农村 | 色丁香六月 | 免费污片在线观看 | 亚洲精品欧美 | 欧美人与禽猛交乱配视频 | 一级片免费观看视频 | 亚洲精品123区 | 国产又黄又爽视频 | 私密视频在线观看 | 人人干人人做 | 精品国产一区二区三区性色av | 国产精欧美一区二区三区白种人 | 欧美熟妇精品久久久久久 | 欧美日韩高清在线 | 激情网五月 | 欧美日韩人妻精品一区二区 | 欧美精品乱码视频一二专区 | 国产午夜精品一区二区三区四区 | 婚后打屁股高h1v1调教 | 日日天天 | 五月天六月婷婷 | 欧美久久久 | 亚洲精久久 | 天天看夜夜操 | www国产在线| 免费人妻一区二区三区 | 日本中文在线观看 | 午夜激情导航 | 天堂8av| 黄色av一区 | 99久久久无码国产精品免费蜜柚 | 白丝久久 | 三级视频网站在线观看 | 国产日韩一区二区三区在线观看 | 国产成人av片 | 国产成人av一区二区三区不卡 | 久久午夜网 | 97射射 | 精品久久电影 | 蜜臀av在线免费观看 | 日韩中文字幕在线 | 色www| 日韩国产在线观看 | 丰满人妻一区二区三区大胸 | 久久免费看少妇高潮 | 欧美亚洲图片小说 | 欧美做受xxxxxⅹ性视频 | 鲁一鲁在线视频 | 强睡邻居人妻中文字幕 | 久久视奸| 粉嫩精品久久99综合一区 | 黄片毛片在线免费观看 | 日本女人性视频 | 第四色在线视频 | 神马午夜影院 | 国模少妇一区二区 | 久久精品不卡 | 国内精品视频一区二区三区 | 欧美美女一级片 | 精品一区二区三区视频在线观看 | 国产在线播放一区二区 | 国产白拍 | 日本熟妇毛茸茸丰满 | 日韩av一区二区在线播放 | 国产做爰免费观看视频 | 国产精品va无码一区二区 | 九七影院在线观看免费观看电视 | 国内精品小视频 | 爱啪啪av| 欧美xxxx中国 | 午夜免费网站 | wwwxxx在线播放 |