forkJoin的使用,分支合併
阿新 • • 發佈:2022-03-24
forkJoin的使用,分支合併
如何使用forkJoin
1、forkJoinPool 通過他來執行
2、計算任務 forkJoinPool.execute(ForkJoinTask task)
3、計算要繼承forkJoinTask
package ForkJoinA; import java.util.concurrent.ExecutionException; import java.util.concurrent.ForkJoinPool; import java.util.concurrent.ForkJoinTask; import java.util.stream.LongStream; /**分支合併 ForkJoin * @author liu */ public class Test { public static void main(String[] args) throws ExecutionException, InterruptedException { //test1();//結果:500000000500000000 時間:4841 //test2();//500000000500000000 時間:7876 test3(); } public static void test1() { Long sum = 0L; long start = System.currentTimeMillis(); for (int i = 1; i <= 10_0000_0000; i++) { sum += i; } long end = System.currentTimeMillis(); System.out.println("結果:" + sum + " 時間:" + (end - start)); } public static void test2() throws ExecutionException, InterruptedException { long start = System.currentTimeMillis(); ForkJoinPool forkJoinPool = new ForkJoinPool(); ForkJoinTask<Long> task = new Demo01(0L, 10_0000_0000L); ForkJoinTask<Long> submit = forkJoinPool.submit(task);//提交任務 Long sum = submit.get(); long end = System.currentTimeMillis(); System.out.println("結果:" + sum + " 時間:" + (end - start)); } public static void test3() { long start = System.currentTimeMillis(); //stream並行流 range併發是() rangeClose是( ] reduce減少 Long sum = LongStream.rangeClosed(0L, 10_0000_0000L).parallel().reduce(0L,Long::sum); long end = System.currentTimeMillis(); System.out.println("結果:" + sum + " 時間:" + (end - start)); } }
extends RecursiveTask ,重寫compute
package ForkJoinA; import java.util.concurrent.RecursiveTask; /** * 如何使用forkJoin * 1、forkJoinPool 通過他來執行 * 2、計算任務 forkJoinPool.execute(ForkJoinTask task) * 3、計算要繼承forkJoinTask * * @author liu */ public class Demo01 extends RecursiveTask<Long> { private Long start; private Long end; //臨界值 private Long temp = 10000L; public Demo01(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 + 1; i++) { sum = sum + i; } return sum; } else {//forkJoin 遞迴 Long mid=(start+end)/2; Demo01 task1=new Demo01(start,mid); task1.fork();//拆分任務,把任務壓入執行緒佇列 Demo01 task2=new Demo01(mid+1,end); task2.fork();//拆分任務,把任務壓入執行緒佇列 return task1.join()+task2.join(); } } }