Main.java Source code

Java tutorial

Introduction

Here is the source code for Main.java

Source

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveTask;

public class Main {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        long expectedSum = 0;
        for (int i = 0; i < 10000; i++) {
            int random = 1 + (int) (Math.random() * ((100 - 1) + 1));
            list.add(random);
            expectedSum += random;
        }
        System.out.println("expected sum: " + expectedSum);
        ForkJoinPool forkJoinPool = new ForkJoinPool(Runtime.getRuntime().availableProcessors());
        RecursiveSum recursiveSum = new RecursiveSum(list, 0, list.size());
        long recSum = forkJoinPool.invoke(recursiveSum);
        System.out.println("recursive-sum: " + recSum);
    }
}

class RecursiveSum extends RecursiveTask<Long> {
    static final int THRESHOLD = 1000;
    List<Integer> list;
    int begin;
    int end;

    public RecursiveSum(List<Integer> list, int begin, int end) {
        super();
        this.list = list;
        this.begin = begin;
        this.end = end;
    }

    @Override
    protected Long compute() {
        final int size = end - begin;
        if (size < THRESHOLD) {
            long sum = 0;
            for (int i = begin; i < end; i++)
                sum += list.get(i);
            return sum;
        } else {
            final int middle = begin + ((end - begin) / 2);
            RecursiveSum sum1 = new RecursiveSum(list, begin, middle);
            sum1.fork();
            RecursiveSum sum2 = new RecursiveSum(list, middle, end);
            return sum2.compute() + sum1.join();
        }
    }
}