import org.apache.commons.lang3.time.StopWatch;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.Future;
import java.util.concurrent.RecursiveTask;
public class CountTask extends RecursiveTask<Integer> {
int start = 0;
int end = 0;
// fork的閾值,即start,end相差大于2的時(shí)候,進(jìn)行fork操作
int threshold = 2;
public CountTask(int start, int end) {
this.start = start;
this.end = end;
}
public static int sum(int start, int end) {
int sum = 0;
for (int i = start; i <= end; i++) {
sum += i;
// 讓當(dāng)前線程睡5秒,模擬某個(gè)耗時(shí)操作
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return sum;
}
@Override
protected Integer compute() {
if (end - start <= threshold) {
return sum(start, end);
} else {
int middle = (end + start) / 2;
CountTask left = new CountTask(start, middle);
CountTask right = new CountTask(middle + 1, end);
left.fork();
right.fork();
int leftResult = left.join();
int rightResult = right.join();
return leftResult + rightResult;
}
}
public static void main(String[] args) throws Exception {
StopWatch stopWatch = new StopWatch();
stopWatch.start();
ForkJoinPool forkJoinPool = new ForkJoinPool();
Future<Integer> task = forkJoinPool.submit(new CountTask(1, 6));
System.out.println("ForkJoin執(zhí)行結(jié)果:" + task.get());
stopWatch.stop();
System.out.println("ForkJoin執(zhí)行耗時(shí):" + stopWatch.getTime() + "ms");
stopWatch.reset();
stopWatch.start();
System.out.println("單線程順序執(zhí)行結(jié)果:" + sum(1, 6));
stopWatch.stop();
System.out.println("單線程順序執(zhí)行耗時(shí):" + stopWatch.getTime() + "ms");
}
}
執(zhí)行的結(jié)果:
ForkJoin執(zhí)行結(jié)果:21
ForkJoin執(zhí)行耗時(shí):15016ms
單線程順序執(zhí)行結(jié)果:21
單線程順序執(zhí)行耗時(shí):30016ms
如果不模擬耗時(shí)操作的情況,執(zhí)行的結(jié)果如下:
ForkJoin執(zhí)行結(jié)果:21
ForkJoin執(zhí)行耗時(shí):15ms
單線程順序執(zhí)行結(jié)果:21
單線程順序執(zhí)行耗時(shí):0ms
可以看出量九,在執(zhí)行耗時(shí)操作的時(shí)候,F(xiàn)orkJoin方式性能的優(yōu)勢比較明顯颂碧。而執(zhí)行非耗時(shí)操作的時(shí)候荠列,單線程的執(zhí)行幾乎不耗時(shí),而ForkJoin方式有15ms载城,應(yīng)該主要是線程創(chuàng)建和銷毀的時(shí)間開銷肌似。