ForkJoinTask

ForkJoin 是采用分而治之的思维,将一个大任务分解为若干个相互独立的子任务(异步),
达到提高运算效率。
我们做一个简单的运算 计算1-100000的累加

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
class TestJoinTask {

public static void main(String[] args) {
long currentTime = System.currentTimeMillis();
ForkJoinPool pool = new ForkJoinPool();
ForkJoinTask<Integer> task = pool.submit(new MyForkJoinTask(1, 100000));

try {
int result = task.get();
System.out.println("result = " + result);
} catch (ExecutionException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程名" + Thread.currentThread().getName() + " 执行完毕" + " time = " + (System.currentTimeMillis() - currentTime));
}

/**
* 传入的范型Integer是返回结果类型
*/
static class MyForkJoinTask extends RecursiveTask<Integer> {

private int startValue;

private int endValue;

private int limitValue = 100;

public MyForkJoinTask(int startValue, int endValue) {
if(startValue > endValue) {
throw new RuntimeException("startValue < endValue");
}
this.startValue = startValue;
this.endValue = endValue;
}

@Override
protected Integer compute() {
if(endValue - startValue <= limitValue) {
System.out.println("线程名" + Thread.currentThread().getName() + " 执行计算");
// 两个值在限制值内 进行计算
int sum = 0;
for(int i = startValue; i <= endValue; i ++) {
sum += i;
}
return sum;
}
MyForkJoinTask task1 = new MyForkJoinTask(startValue, (endValue + startValue) / 2);
task1.fork();
MyForkJoinTask task2 = new MyForkJoinTask((endValue + startValue) / 2 + 1, endValue);
task2.fork();
return task1.join() + task2.join();
}
}
}

如上所示,我们将一个从0 - 100000的累加任务分解为500个子任务:每200位数累加

在日志打印中,我们可以看到,有多个线程在执行任务,也就是说,分解的任务其实都是提交到线程池中执行,