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