package codeine.fork_join; import static java.util.Arrays.asList; import java.util.Random; import java.util.concurrent.ForkJoinPool; import java.util.concurrent.RecursiveAction; public class ForkJoinRandomFillAction { Random random = new Random(); public void loadArray(int[] array) { for (int i=0; i<array.length; i++) { array[i] = random.nextInt(10000); //Generates numbers from 0 to 10000 } } public static void main(String[] args) { ForkJoinRandomFillAction sort = new ForkJoinRandomFillAction(); int arrayLength = 1_00_00_0000; int array[] = new int[arrayLength]; //No. of times sequential & Parallel operation should be performed to warm up HotSpot JVM final int iterations = 10; for (int i = 0; i < iterations; i++) { long start = System.currentTimeMillis(); sort.loadArray(array); System.out.println("Sequential processing time: " + (System.currentTimeMillis() - start) + " ms"); } System.out.println("Number of processor available: " + Runtime.getRuntime().availableProcessors()); ForkJoinPool fjpool = new ForkJoinPool(64); //Default parallelism level = Runtime.getRuntime().availableProcessors() for (int i = 0; i < iterations; i++) { // Create a task with the complete array RecursiveAction task = new RandomFillAction(array, 0, array.length); long start = System.currentTimeMillis(); fjpool.invoke(task); System.out.println("Parallel processing time: " + (System.currentTimeMillis() - start)+ " ms"); } System.out.println("Number of steals: " + fjpool.getStealCount() + "\n"); } } class RandomFillAction extends RecursiveAction { private static final long serialVersionUID = 1L; final int low; final int high; private int[] array; final int splitSize = 40000; //Some threshold size to spit the task public RandomFillAction(int[] array, int low, int high) { this.low = low; this.high = high; this.array = array; } @Override protected void compute() { if (high - low > splitSize) { // task is huge so divide in half int mid = (low + high) >>> 1; invokeAll(asList(new RandomFillAction(array, low, mid), new RandomFillAction(array, mid, high))); } else { //Some calculation logic Random random = new Random(); for (int i = low; i < high; i++) { array[i] = random.nextInt(10000); } } } }