CodesJava

Easy learning with example program codes

fork join in java


The ForkJoinPool was introduced in java 7. It works on fork and join principle. In first step (fork) the task splits itself into smaller subtask which will be executed concurrently. In second step (join) when subtask completes its execution, the task will merge all results into one result.

Example

import java.util.Arrays;
import java.util.Random;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveAction;
 
public class ForkAndJoinTest {
  public static void main(String[] args) {
      Problem test = new Problem();
      //Check the number of available processors
      int nThreads = Runtime.getRuntime().availableProcessors();
      System.out.println(nThreads);
      Solver solver = new Solver(test.getList());
      ForkJoinPool pool = new ForkJoinPool(nThreads);
      pool.invoke(solver);
      long result = solver.getResult();
      System.out.println("Done. Result: " + result);
      long sum = 0;
      for (int i = 0; i < test.getList().length; i++) {
          sum += test.getList()[i];
      }
      System.out.println("Done. Result: " + sum);
  }
}
 
class Problem {
    private final int[] list = new int[1000000];
    public Problem() {
        Random generator = new Random(19580427);
        for (int i = 0; i < list.length; i++) {
            list[i] = generator.nextInt(250000);
        }
    }
 
    public int[] getList() {
        return list;
    }
}
 
class Solver extends RecursiveAction {
    private int[] list;
    public long result;
 
    public Solver(int[] array) {
        this.list = array;
    }
 
    @Override
    protected void compute() {
        if (list.length == 1) {
            result = list[0];
        } else {
            int midpoint = list.length / 2;
            int[] l1 = Arrays.copyOfRange(list, 0, midpoint);
            int[] l2 = Arrays.copyOfRange(list, midpoint, list.length);
            Solver s1 = new Solver(l1);
            Solver s2 = new Solver(l2);
            s1.fork();
            s2.compute();
            s1.join();
            result = s1.result + s2.result;
        }
    }
 
	public long getResult() {
		return result;
	}
}

Output

4
Done. Result: 125021613035
Done. Result: 125021613035

Related topics

Please follow and like us:
Posted in Java   

Core Java Tutorial



Copyright © 2019 CodesJava DMCA.com Protection Status SiteMap Reference: Java Wiki