From f3d904c7266bc91d81deb6beed7f486d659228ef Mon Sep 17 00:00:00 2001 From: ppapou Date: Wed, 9 Aug 2023 18:45:08 -0400 Subject: [PATCH 1/4] The first task of multithreading module - fork and join files have added with codebase --- src/sort/ForkJoinSortTask.java | 33 ++++++++++++ src/sort/MergeSortTask.java | 98 ++++++++++++++++++++++++++++++++++ 2 files changed, 131 insertions(+) create mode 100644 src/sort/ForkJoinSortTask.java create mode 100644 src/sort/MergeSortTask.java diff --git a/src/sort/ForkJoinSortTask.java b/src/sort/ForkJoinSortTask.java new file mode 100644 index 0000000..85b0c71 --- /dev/null +++ b/src/sort/ForkJoinSortTask.java @@ -0,0 +1,33 @@ +package sort; + +import java.util.Arrays; +import java.util.Scanner; +import java.util.concurrent.ForkJoinPool; + +public class ForkJoinSortTask { + + public static void main(String[] args) { + + Scanner scanner = new Scanner(System.in); + + System.out.println("Please, enter the number array elements"); + int totalNumbers = scanner.nextInt(); + int[] numbers = new int[totalNumbers]; + + System.out.println("Please, enter each element of array"); + for (int i = 0; i < totalNumbers; i++) { + numbers[i] = scanner.nextInt(); + } + + System.out.println("Unsorted array: " + + Arrays.toString(numbers)); + + MergeSortTask task = new MergeSortTask(numbers); + ForkJoinPool forkJoinPool = new ForkJoinPool(); + forkJoinPool.invoke(task); + + System.out.println("Sorted array: " + + Arrays.toString(task.join())); + + } +} \ No newline at end of file diff --git a/src/sort/MergeSortTask.java b/src/sort/MergeSortTask.java new file mode 100644 index 0000000..d06f5e1 --- /dev/null +++ b/src/sort/MergeSortTask.java @@ -0,0 +1,98 @@ +package sort; + +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.RecursiveTask; + +//thread in Java, inherit OR create the Runnable +//concurrency(synchronise vs locks) +//fork/join pattern -> idea of this pattern +//thread vs process vs virt threads +//worker/pool/thread pattern(in concurrency see que and executers how it works!!) +//stream API(non terminal and terminal operators in streams), the price of the parallel interface +//completable future(callable interface vs runnable!) + + +//OPTIONAL for FUTURE -> reactive framework(web-flux and functional programming/Reactive extension standard) +class MergeSortTask extends RecursiveTask { + + int[] arrayToDivide; + + public MergeSortTask(int[] arrayToDivide) { + this.arrayToDivide = arrayToDivide; + } + + @Override + protected int[] compute() { + + /* + * Divide the array till it has only 1 element. + */ + if (arrayToDivide.length > 1) { + + List partitionedArray = partitionArray(); + System.out.println("The First Element of partitioned array: " + Arrays.toString(partitionedArray.get(0))); + System.out.println("The Second Element of partitioned array: " + Arrays.toString(partitionedArray.get(1))); + System.out.println("Length of initial array: " + arrayToDivide.length); + MergeSortTask task1 = new MergeSortTask(partitionedArray.get(0)); + MergeSortTask task2 = new MergeSortTask(partitionedArray.get(1)); + invokeAll(task1, task2); + + //Wait for results from both the tasks + int[] array1 = task1.join(); + int[] array2 = task2.join(); + + //Initialize a merged array + int[] mergedArray = + new int[array1.length + array2.length]; + + mergeArrays(task1.join(), task2.join(), mergedArray); + + return mergedArray; + } + return arrayToDivide; + } + + private List partitionArray(){ + + int [] partition1 = Arrays.copyOfRange(arrayToDivide, 0, + arrayToDivide.length / 2); + + int [] partition2 = Arrays.copyOfRange(arrayToDivide, + arrayToDivide.length / 2, + arrayToDivide.length); + return Arrays.asList(partition1,partition2); + + } + + private void mergeArrays( + int[] array1, + int[] array2, + int[] mergedArray) { + + int i = 0, j = 0, k = 0; + + while ((i < array1.length) && (j < array2.length)) { + + if (array1[i] < array2[j]) { + mergedArray[k] = array1[i++]; + } else { + mergedArray[k] = array2[j++]; + } + k++; + } + + if (i == array1.length) { + + for (int a = j; a < array2.length; a++) { + mergedArray[k++] = array2[a]; + } + + } else { + + for (int a = i; a < array1.length; a++) { + mergedArray[k++] = array1[a]; + } + } + } +} \ No newline at end of file From bdcebbb3e02b65cf839796ace7c1be6d5fca30d8 Mon Sep 17 00:00:00 2001 From: ppapou Date: Thu, 10 Aug 2023 10:23:58 -0400 Subject: [PATCH 2/4] Cosmetic changes --- src/sort/MergeSortTask.java | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/src/sort/MergeSortTask.java b/src/sort/MergeSortTask.java index d06f5e1..2c5173c 100644 --- a/src/sort/MergeSortTask.java +++ b/src/sort/MergeSortTask.java @@ -4,17 +4,7 @@ import java.util.List; import java.util.concurrent.RecursiveTask; -//thread in Java, inherit OR create the Runnable -//concurrency(synchronise vs locks) -//fork/join pattern -> idea of this pattern -//thread vs process vs virt threads -//worker/pool/thread pattern(in concurrency see que and executers how it works!!) -//stream API(non terminal and terminal operators in streams), the price of the parallel interface -//completable future(callable interface vs runnable!) - - -//OPTIONAL for FUTURE -> reactive framework(web-flux and functional programming/Reactive extension standard) -class MergeSortTask extends RecursiveTask { + class MergeSortTask extends RecursiveTask { int[] arrayToDivide; From 57491c4a7cd6260c899b69160795afa11a61ac8d Mon Sep 17 00:00:00 2001 From: ppapou Date: Thu, 10 Aug 2023 17:32:11 -0400 Subject: [PATCH 3/4] Merge-sort task module - the project structure has changed --- {src/sort => murge-sort/src}/ForkJoinSortTask.java | 2 -- {src/sort => murge-sort/src}/MergeSortTask.java | 4 ++-- 2 files changed, 2 insertions(+), 4 deletions(-) rename {src/sort => murge-sort/src}/ForkJoinSortTask.java (98%) rename {src/sort => murge-sort/src}/MergeSortTask.java (99%) diff --git a/src/sort/ForkJoinSortTask.java b/murge-sort/src/ForkJoinSortTask.java similarity index 98% rename from src/sort/ForkJoinSortTask.java rename to murge-sort/src/ForkJoinSortTask.java index 85b0c71..f6d824e 100644 --- a/src/sort/ForkJoinSortTask.java +++ b/murge-sort/src/ForkJoinSortTask.java @@ -1,5 +1,3 @@ -package sort; - import java.util.Arrays; import java.util.Scanner; import java.util.concurrent.ForkJoinPool; diff --git a/src/sort/MergeSortTask.java b/murge-sort/src/MergeSortTask.java similarity index 99% rename from src/sort/MergeSortTask.java rename to murge-sort/src/MergeSortTask.java index 2c5173c..d9c1708 100644 --- a/src/sort/MergeSortTask.java +++ b/murge-sort/src/MergeSortTask.java @@ -1,5 +1,3 @@ -package sort; - import java.util.Arrays; import java.util.List; import java.util.concurrent.RecursiveTask; @@ -21,9 +19,11 @@ protected int[] compute() { if (arrayToDivide.length > 1) { List partitionedArray = partitionArray(); + System.out.println("The First Element of partitioned array: " + Arrays.toString(partitionedArray.get(0))); System.out.println("The Second Element of partitioned array: " + Arrays.toString(partitionedArray.get(1))); System.out.println("Length of initial array: " + arrayToDivide.length); + MergeSortTask task1 = new MergeSortTask(partitionedArray.get(0)); MergeSortTask task2 = new MergeSortTask(partitionedArray.get(1)); invokeAll(task1, task2); From a18f12ee203f8c5f30dfeb5083e7e5b9f1ae56fd Mon Sep 17 00:00:00 2001 From: ppapou Date: Thu, 10 Aug 2023 17:34:25 -0400 Subject: [PATCH 4/4] Module name typo --- {murge-sort => merge-sort}/src/ForkJoinSortTask.java | 0 {murge-sort => merge-sort}/src/MergeSortTask.java | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename {murge-sort => merge-sort}/src/ForkJoinSortTask.java (100%) rename {murge-sort => merge-sort}/src/MergeSortTask.java (100%) diff --git a/murge-sort/src/ForkJoinSortTask.java b/merge-sort/src/ForkJoinSortTask.java similarity index 100% rename from murge-sort/src/ForkJoinSortTask.java rename to merge-sort/src/ForkJoinSortTask.java diff --git a/murge-sort/src/MergeSortTask.java b/merge-sort/src/MergeSortTask.java similarity index 100% rename from murge-sort/src/MergeSortTask.java rename to merge-sort/src/MergeSortTask.java