import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.Scanner;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.Arrays;

public class ParallelSumStreams
{
    public static void main (String[] args)
    {
        System.out.print ("p ==> ");
        Scanner input = new Scanner (System.in);
        int numThreads = input.nextInt ();
        System.out.println ("(hardware threads = "
                            + Runtime.getRuntime ().availableProcessors () + ")");
        System.out.print ("N ==> ");
        int N = input.nextInt ();
        System.out.println ();
        input.close ();

        int[] A = new int[N];
        Random rand = new Random ();
        final int UPPER_BOUND = 4;
        for (int i = 0; i < N; ++i)
            A[i] = rand.nextInt (UPPER_BOUND + 1);

        long start = System.currentTimeMillis ();
        int parallelSum = Arrays.stream (A).parallel ().sum ();
        long stop = System.currentTimeMillis ();

        long elapsedMs = stop - start;
        System.out.println ("// sum:       " + parallelSum);
        System.out.println ("// time:      " + elapsedMs + " ms\n");

        start = System.currentTimeMillis ();
        int serialSum = serialSum (A);
        stop = System.currentTimeMillis ();
        System.out.println ("Serial sum:   " + serialSum);
        elapsedMs = stop - start;
        System.out.println ("Serial time:  " + elapsedMs + " ms");
    }

    private static int serialSum (final int[] A)
    {
        int sum = 0;
        for (int e : A)
            sum += e;
        return sum;
    }
}
