最近的幾個技術問題總結和答疑 (r8筆記第19天)
阿新 • • 發佈:2022-05-04
Fork/Join框架強調任務的分解。
該框架主要有Fork,join兩個操作組成,Fork操作主要用於對任務和資料進行劃分。join操作用於對各個部分的執行結果進行合併
該框架有一個重要的方法,叫做工作竊取法,當一個執行緒完成任務時,會去檢視其它執行緒是否完成了任務,如果沒有,就將竊取一部分任務來處理,提高效率和資源利用率
繼承RecursiveTask類,重寫compute方法。來建立執行緒任務
package com.luoKing.ForkJoin; import java.util.concurrent.RecursiveTask; public class ForkJTask extends RecursiveTask<Long>{ //計算1-10_0000_0000的和 //具體任務 private Long start; private Long end; private int temp = 5_0000;//門檻值 public ForkJTask(Long start, Long end) { this.start = start; this.end = end; } @Override protected Long compute() { if((end-start)<temp){ Long sum = 0L;//總結果 for (Long i = start; i <= end; i++) { sum +=i; } return sum; }else{ Long middle = (start+end)/2;//中間值 ForkJTask task1 = new ForkJTask(start, middle);//任務1 task1.fork();//拆分任務,將執行緒壓入佇列 ForkJTask task2 = new ForkJTask(middle + 1, end); task2.fork(); return task1.join()+task2.join();//合併結果 } } }
使用ForkJoinPool類來啟動執行緒任務
package com.luoKing.ForkJoin; import java.util.concurrent.ExecutionException; import java.util.concurrent.ForkJoinPool; import java.util.concurrent.ForkJoinTask; public class test { public static void main(String[] args) throws ExecutionException, InterruptedException { ForkJoinPool forkJoinPool = new ForkJoinPool(); ForkJTask forkJTask = new ForkJTask(0L,10_0000_0000L); ForkJoinTask<Long> submit = forkJoinPool.submit(forkJTask); System.out.println(submit.get()); } }
Fork/Join框架的程式設計模式決定了它更適合具有遞迴操作的程式,通常需要程式設計師手動設定閾值。可操作性強