Skip to content

Commit ccd63f8

Browse files
author
cicadasmile
committed
Java并发编程:Fork/Join框架机制详解
1 parent 60eab5e commit ccd63f8

File tree

1 file changed

+65
-0
lines changed
  • java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block07forkjoin

1 file changed

+65
-0
lines changed
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
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

Comments
 (0)