1+ package com .multy .thread .block07forkjoin ;
2+
3+ import java .util .concurrent .ForkJoinPool ;
4+ import java .util .concurrent .ForkJoinTask ;
5+ import java .util .concurrent .RecursiveTask ;
6+
7+ public class ForkJoin01 {
8+
9+ public static void main (String [] args ) {
10+ int [] numArr = new int [100 ];
11+ for (int i = 0 ; i < 100 ; i ++) {
12+ numArr [i ] = i + 1 ;
13+ }
14+ ForkJoinPool pool = new ForkJoinPool ();
15+ ForkJoinTask <Integer > forkJoinTask =
16+ pool .submit (new SumTask (numArr , 0 , numArr .length ));
17+ System .out .println ("合并计算结果: " + forkJoinTask .invoke ());
18+ pool .shutdown ();
19+ }
20+ }
21+ /**
22+ * 线程任务
23+ */
24+ class SumTask extends RecursiveTask <Integer > {
25+ /*
26+ * 切分任务块的阈值
27+ * 如果THRESHOLD=100
28+ * 输出:main【求和:(0...100)=5050】 合并计算结果: 5050
29+ */
30+ private static final int THRESHOLD = 100 ;
31+ private int arr [];
32+ private int start ;
33+ private int over ;
34+
35+ public SumTask (int [] arr , int start , int over ) {
36+ this .arr = arr ;
37+ this .start = start ;
38+ this .over = over ;
39+ }
40+
41+ // 求和计算
42+ private Integer sumCalculate () {
43+ Integer sum = 0 ;
44+ for (int i = start ; i < over ; i ++) {
45+ sum += arr [i ];
46+ }
47+ String task = "【求和:(" + start + "..." + over + ")=" + sum +"】" ;
48+ System .out .println (Thread .currentThread ().getName () + task );
49+ return sum ;
50+ }
51+
52+ @ Override
53+ protected Integer compute () {
54+ if ((over - start ) <= THRESHOLD ) {
55+ return sumCalculate ();
56+ }else {
57+ int middle = (start + over ) / 2 ;
58+ SumTask left = new SumTask (arr , start , middle );
59+ SumTask right = new SumTask (arr , middle , over );
60+ left .fork ();
61+ right .fork ();
62+ return left .join () + right .join ();
63+ }
64+ }
65+ }
0 commit comments