From fbb1cca47ea040cbd0dd8354554af471352748ea Mon Sep 17 00:00:00 2001 From: javahongxi Date: Sun, 11 Aug 2019 22:27:00 +0800 Subject: [PATCH] ForkJoinTest --- .../java/util/concurrent/ForkJoinTest.java | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 whatsmars-common/src/test/java/org/hongxi/java/util/concurrent/ForkJoinTest.java diff --git a/whatsmars-common/src/test/java/org/hongxi/java/util/concurrent/ForkJoinTest.java b/whatsmars-common/src/test/java/org/hongxi/java/util/concurrent/ForkJoinTest.java new file mode 100644 index 00000000..b864f494 --- /dev/null +++ b/whatsmars-common/src/test/java/org/hongxi/java/util/concurrent/ForkJoinTest.java @@ -0,0 +1,45 @@ +package org.hongxi.java.util.concurrent; + +import java.util.concurrent.ForkJoinPool; +import java.util.concurrent.RecursiveTask; + +/** + * @author shenhongxi 2019/8/11 + */ +public class ForkJoinTest { + + public static void main(String[] args) { + ForkJoinPool forkJoinPool = new ForkJoinPool(Runtime.getRuntime().availableProcessors() * 2); + int sum = forkJoinPool.invoke(new AccumulationTask(1, 60000)); + System.out.println(sum); + } + + static class AccumulationTask extends RecursiveTask { + private int start; + private int end; + + AccumulationTask(int start, int end) { + super(); + this.start = start; + this.end = end; + } + + @Override + protected Integer compute() { + int result = 0; + if (end - start <= 2) { + for (int i = start; i <= end; i++) { + result += i; + } + } else { + int middle = (start + end) / 2; + AccumulationTask left = new AccumulationTask(start, middle); + AccumulationTask right = new AccumulationTask(middle + 1, end); + left.fork(); + right.fork(); + result = left.join() + right.join(); + } + return result; + } + } +} -- GitLab