package com.example.forkjoin;

import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveAction;

public class PrintTask extends RecursiveAction {

	private static final int THRESHOLD = 10;
	private final int[] array;
	private final int start;
	private final int end;
	private static int sum;  // 1. define

	public PrintTask(int[] array, int start, int end) {
		this.array = array;
		this.start = start;
		this.end = end;
	}

	@Override
	protected void compute() {
		if (end - start <= THRESHOLD) {
			for (int i = start; i < end; i++) {
				// display output to console
				System.out.println(Thread.currentThread().getName() + ": " + array[i]);
				// 2. calculate sum
				sum += array[i];
			}
		} else {
			int mid = (start + end) / 2;
			PrintTask leftTask = new PrintTask(array, start, mid);
			PrintTask rightTask = new PrintTask(array, mid, end);
			invokeAll(leftTask, rightTask);
		}
	}

	public static void main(String[] args) {
		ForkJoinPool pool = new ForkJoinPool();
		int[] array = new int[100];
		for (int i = 0; i < array.length; i++) {
			array[i] = i + 1;
		}
		PrintTask task = new PrintTask(array, 0, array.length);
		pool.invoke(task);
		// 3. display result
		System.out.println("Sum is " + sum);
	}
}
