In this program we have taken the array as input from the user and then created various tasks on the array field and then we have done the summation of the current task.
Java Program -
JoinFork.java -
package com.gpm.joinforkproject;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.concurrent.ForkJoinPool;
public class JoinFork {
public static void main(String[] args) {
// write your code here
Scanner sc = new Scanner(System.in);
int size;
int result;
System.out.println("Enter Number of elements> ");
size = sc.nextInt();
ArrayList<Integer> elements = new ArrayList<Integer>(size);
System.out.println("Enter Elements > ");
for(int i=0 ;i<size;i++)
{
elements.add(sc.nextInt());
}
ForkJoinPool pool = new ForkJoinPool();
CustomRecursiveTask customRecursiveTask = new CustomRecursiveTask(elements);
result = pool.invoke(customRecursiveTask);
System.out.println("Addition > "+result);
}
}
CustomRecursiveTask.java -
package com.gpm.joinforkproject;
import java.util.concurrent.RecursiveTask;
import java.util.ArrayList;
import java.util.List;
public class CustomRecursiveTask extends RecursiveTask<Integer> {
ArrayList<Integer> task;
int threshold = 2;
public CustomRecursiveTask(ArrayList<Integer> task) {
this.task = task;
System.out.println();
System.out.println("Task Array> ");
for (Integer i : task) {
System.out.print(i + " ");
}
System.out.println();
}
@Override
protected Integer compute() {
int result = 0;
if (task.size() > threshold) {
//Divide current task into subtask
List<CustomRecursiveTask> taskList = new ArrayList<CustomRecursiveTask>();
taskList.addAll(CreateSubtask());
for (CustomRecursiveTask subtask : taskList) {
subtask.fork();
}
for (CustomRecursiveTask subtask : taskList) {
result += subtask.join();
}
} else {
//process task
result = Process();
}
System.out.println("Addition of current task >" + result);
return result;
}
private int Process() {
int result = 0;
for (int i = 0; i < this.task.size(); i++) {
result = result + this.task.get(i);
}
return result;
}
private List<CustomRecursiveTask> CreateSubtask() {
int listSize = this.task.size();
List<CustomRecursiveTask> subtask = new ArrayList<CustomRecursiveTask>(2);
ArrayList<Integer> FirstArray = new ArrayList<Integer>();
FirstArray = MakeArrayIntegerList(this.task, 0, listSize / 2 - 1);
ArrayList<Integer> SecondArray = new ArrayList<Integer>();
SecondArray = MakeArrayIntegerList(this.task, listSize / 2, listSize - 1);
subtask.add(new CustomRecursiveTask(FirstArray));
subtask.add(new CustomRecursiveTask(SecondArray));
return subtask;
}
private ArrayList<Integer> MakeArrayIntegerList(ArrayList<Integer> list, int startIndex, int lastIndex) {
ArrayList<Integer> newList = new ArrayList<Integer>();
for (int i = startIndex; i <= lastIndex; i++) {
newList.add(list.get(i));
}
return newList;
}
}
Output -
0 Comments