在必要的情况下,将一个大任务拆分成多个小任务(不可再拆分),然后将小任务的计算结果进行汇总。
当一个线程上获取不到任务的时候,它将会到其他线程的尾部去截取一个任务来执行。
publicclassThreadTest{publicstaticvoidmain(String[] args){ ForkJoinPool pool=newForkJoinPool(); ForkJoinTask<Long> task=newForkJoinDemo(0L,100000000L); Long sum= pool.invoke(task); System.out.println(sum);}}classForkJoinDemoextendsRecursiveTask<Long>{privatestaticfinallong serivalVersionUID=-5235345621564052455L;privatelong start;privatelong end;privatestaticfinallong THURSHOLD=10000L;//临界值publicForkJoinDemo(long start,long end){this.start= start;this.end= end;}@Overrideprotected Longcompute(){long length= end- start;if(length<=THURSHOLD){long sum=0L;for(long i=start;i< end;i++){ sum+=i;}return sum;}else{long middle=(start+ end)/2; ForkJoinDemo left=newForkJoinDemo(start,middle); left.fork();//进行拆分,压入队列 ForkJoinDemo right=newForkJoinDemo(middle+1,end); right.fork();return left.join()+ right.join();}}}