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;
}
} |
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 |
4
Done. Result: 125021613035
Done. Result: 125021613035