From 268f750ba6d710c66eae26197c5469c800687469 Mon Sep 17 00:00:00 2001 From: jeanfern5 Date: Sun, 28 Apr 2024 09:25:51 -0700 Subject: [PATCH 01/40] Chapter 3 Lecture 1: Thread Creation --- .../build.gradle | 0 .../gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 .../gradlew | 0 .../settings.gradle | 0 .../src/main/java/Main.java | 15 +++++++-------- 6 files changed, 7 insertions(+), 8 deletions(-) rename chapter_3/{lecture_1 => lecture_1_Thread-Creation}/build.gradle (100%) rename chapter_3/{lecture_1 => lecture_1_Thread-Creation}/gradle/wrapper/gradle-wrapper.jar (100%) rename chapter_3/{lecture_1 => lecture_1_Thread-Creation}/gradle/wrapper/gradle-wrapper.properties (100%) rename chapter_3/{lecture_1 => lecture_1_Thread-Creation}/gradlew (100%) rename chapter_3/{lecture_1 => lecture_1_Thread-Creation}/settings.gradle (100%) rename chapter_3/{lecture_1 => lecture_1_Thread-Creation}/src/main/java/Main.java (72%) diff --git a/chapter_3/lecture_1/build.gradle b/chapter_3/lecture_1_Thread-Creation/build.gradle similarity index 100% rename from chapter_3/lecture_1/build.gradle rename to chapter_3/lecture_1_Thread-Creation/build.gradle diff --git a/chapter_3/lecture_1/gradle/wrapper/gradle-wrapper.jar b/chapter_3/lecture_1_Thread-Creation/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from chapter_3/lecture_1/gradle/wrapper/gradle-wrapper.jar rename to chapter_3/lecture_1_Thread-Creation/gradle/wrapper/gradle-wrapper.jar diff --git a/chapter_3/lecture_1/gradle/wrapper/gradle-wrapper.properties b/chapter_3/lecture_1_Thread-Creation/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from chapter_3/lecture_1/gradle/wrapper/gradle-wrapper.properties rename to chapter_3/lecture_1_Thread-Creation/gradle/wrapper/gradle-wrapper.properties diff --git a/chapter_3/lecture_1/gradlew b/chapter_3/lecture_1_Thread-Creation/gradlew similarity index 100% rename from chapter_3/lecture_1/gradlew rename to chapter_3/lecture_1_Thread-Creation/gradlew diff --git a/chapter_3/lecture_1/settings.gradle b/chapter_3/lecture_1_Thread-Creation/settings.gradle similarity index 100% rename from chapter_3/lecture_1/settings.gradle rename to chapter_3/lecture_1_Thread-Creation/settings.gradle diff --git a/chapter_3/lecture_1/src/main/java/Main.java b/chapter_3/lecture_1_Thread-Creation/src/main/java/Main.java similarity index 72% rename from chapter_3/lecture_1/src/main/java/Main.java rename to chapter_3/lecture_1_Thread-Creation/src/main/java/Main.java index 3d5fb6f..0c5c40a 100644 --- a/chapter_3/lecture_1/src/main/java/Main.java +++ b/chapter_3/lecture_1_Thread-Creation/src/main/java/Main.java @@ -1,3 +1,5 @@ +//Chapter 3 Lecture 1: Thread Creation + public class Main { // public static void main(String[] args) throws InterruptedException { // Thread thread = Thread.currentThread(); @@ -8,12 +10,11 @@ public class Main { // System.out.println("Current thread: " + thread.getName()); // } -// public static void main(String[] args) { +// public static void main(String[] args) throws InterruptedException { // // 1. Extend the Thread class -// // 2. Use Runnable interface -// +// // 2. Use runnable interface // MyThread myThread = new MyThread(); -// myThread.run(); +// myThread.start(); // } // // static class MyThread extends Thread { @@ -25,11 +26,9 @@ public class Main { public static void main(String[] args) throws InterruptedException { System.out.println("[1] Current thread: " + Thread.currentThread().getName()); - +// Runnable runnable = () -> System.out.println("Current thread: " + Thread.currentThread().getName()); Thread thread = new Thread( - () -> { - System.out.println("[2] Current thread: " + Thread.currentThread().getName()); - } + () -> System.out.println("[2] Current thread: " + Thread.currentThread().getName()) ); thread.setName("MyThread"); thread.start(); From c144e383c80ceda87285986d560c5954ef5e60aa Mon Sep 17 00:00:00 2001 From: jeanfern5 Date: Sun, 28 Apr 2024 09:27:05 -0700 Subject: [PATCH 02/40] missed file --- chapter_3/{lecture_1 => lecture_1_Thread-Creation}/gradlew.bat | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename chapter_3/{lecture_1 => lecture_1_Thread-Creation}/gradlew.bat (100%) diff --git a/chapter_3/lecture_1/gradlew.bat b/chapter_3/lecture_1_Thread-Creation/gradlew.bat similarity index 100% rename from chapter_3/lecture_1/gradlew.bat rename to chapter_3/lecture_1_Thread-Creation/gradlew.bat From d38eae2fa7c469cee97d62856ea140abee71e762 Mon Sep 17 00:00:00 2001 From: jeanfern5 Date: Sun, 28 Apr 2024 09:32:38 -0700 Subject: [PATCH 03/40] Chapter 3 Lecture 2: Thread Creation --- .../build.gradle | 0 .../gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 .../gradlew | 0 .../gradlew.bat | 0 .../settings.gradle | 0 .../src/main/java/Main.java | 32 ++++++++++-------- .../.idea/.gitignore | 4 +++ 8 files changed, 22 insertions(+), 14 deletions(-) rename chapter_3/{lecture_2 => lecture_2-Thread-Priorities-and-States}/build.gradle (100%) rename chapter_3/{lecture_2 => lecture_2-Thread-Priorities-and-States}/gradle/wrapper/gradle-wrapper.jar (100%) rename chapter_3/{lecture_2 => lecture_2-Thread-Priorities-and-States}/gradle/wrapper/gradle-wrapper.properties (100%) rename chapter_3/{lecture_2 => lecture_2-Thread-Priorities-and-States}/gradlew (100%) rename chapter_3/{lecture_2 => lecture_2-Thread-Priorities-and-States}/gradlew.bat (100%) rename chapter_3/{lecture_2 => lecture_2-Thread-Priorities-and-States}/settings.gradle (100%) rename chapter_3/{lecture_2 => lecture_2-Thread-Priorities-and-States}/src/main/java/Main.java (56%) create mode 100644 chapter_3/lecture_6-Thread-Local-Variables-and-Race-Conditions/.idea/.gitignore diff --git a/chapter_3/lecture_2/build.gradle b/chapter_3/lecture_2-Thread-Priorities-and-States/build.gradle similarity index 100% rename from chapter_3/lecture_2/build.gradle rename to chapter_3/lecture_2-Thread-Priorities-and-States/build.gradle diff --git a/chapter_3/lecture_2/gradle/wrapper/gradle-wrapper.jar b/chapter_3/lecture_2-Thread-Priorities-and-States/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from chapter_3/lecture_2/gradle/wrapper/gradle-wrapper.jar rename to chapter_3/lecture_2-Thread-Priorities-and-States/gradle/wrapper/gradle-wrapper.jar diff --git a/chapter_3/lecture_2/gradle/wrapper/gradle-wrapper.properties b/chapter_3/lecture_2-Thread-Priorities-and-States/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from chapter_3/lecture_2/gradle/wrapper/gradle-wrapper.properties rename to chapter_3/lecture_2-Thread-Priorities-and-States/gradle/wrapper/gradle-wrapper.properties diff --git a/chapter_3/lecture_2/gradlew b/chapter_3/lecture_2-Thread-Priorities-and-States/gradlew similarity index 100% rename from chapter_3/lecture_2/gradlew rename to chapter_3/lecture_2-Thread-Priorities-and-States/gradlew diff --git a/chapter_3/lecture_2/gradlew.bat b/chapter_3/lecture_2-Thread-Priorities-and-States/gradlew.bat similarity index 100% rename from chapter_3/lecture_2/gradlew.bat rename to chapter_3/lecture_2-Thread-Priorities-and-States/gradlew.bat diff --git a/chapter_3/lecture_2/settings.gradle b/chapter_3/lecture_2-Thread-Priorities-and-States/settings.gradle similarity index 100% rename from chapter_3/lecture_2/settings.gradle rename to chapter_3/lecture_2-Thread-Priorities-and-States/settings.gradle diff --git a/chapter_3/lecture_2/src/main/java/Main.java b/chapter_3/lecture_2-Thread-Priorities-and-States/src/main/java/Main.java similarity index 56% rename from chapter_3/lecture_2/src/main/java/Main.java rename to chapter_3/lecture_2-Thread-Priorities-and-States/src/main/java/Main.java index 952f59b..50d787f 100644 --- a/chapter_3/lecture_2/src/main/java/Main.java +++ b/chapter_3/lecture_2-Thread-Priorities-and-States/src/main/java/Main.java @@ -1,23 +1,28 @@ -public class Main { +// Chapter 3 Lecture 2: Thread Priority and States + +import javax.swing.plaf.TableHeaderUI; + +class Scratch { // public static void main(String[] args) throws InterruptedException { +// // main thread // Thread.currentThread().setPriority(Thread.MAX_PRIORITY); // +// // new thread // Thread thread1 = new Thread(() -> { // Thread currentThread = Thread.currentThread(); -// System.out.println(currentThread.getName() + " priority = " + currentThread.getPriority()); +// System.out.println(currentThread.getName() + ": priority = " + currentThread.getPriority()); // }); -// // thread1.setName("Thread_1"); // thread1.setPriority(Thread.MAX_PRIORITY); // // Thread thread2 = new Thread(() -> { // Thread currentThread = Thread.currentThread(); -// System.out.println(currentThread.getName() + " priority = " + currentThread.getPriority()); +// System.out.println(currentThread.getName() + ": priority = " + currentThread.getPriority()); // }); -// // thread2.setName("Thread_2"); // thread2.setPriority(Thread.MIN_PRIORITY); // +// // thread1.start(); // thread2.start(); // @@ -26,19 +31,18 @@ public class Main { // } public static void main(String[] args) throws InterruptedException { + // new thread Thread thread = new Thread(() -> { Thread currentThread = Thread.currentThread(); - System.out.println("[1] State: " + currentThread.getState()); + System.out.println("[1] State: " + currentThread.getState()); // RUNNABLE }); - System.out.println("[2] State: " + thread.getState()); - - thread.start(); - - System.out.println("[3] State: " + thread.getState()); + System.out.println("[2] State: " + thread.getState()); // NEW - thread.join(); + thread.start(); // started new thread + System.out.println("[3] State: " + thread.getState()); // RUNNABLE - System.out.println("[4] State: " + thread.getState()); + thread.join(); // joins main thread + System.out.println("[4] State: " + thread.getState()); // TERMINATE } -} +} \ No newline at end of file diff --git a/chapter_3/lecture_6-Thread-Local-Variables-and-Race-Conditions/.idea/.gitignore b/chapter_3/lecture_6-Thread-Local-Variables-and-Race-Conditions/.idea/.gitignore new file mode 100644 index 0000000..95b0275 --- /dev/null +++ b/chapter_3/lecture_6-Thread-Local-Variables-and-Race-Conditions/.idea/.gitignore @@ -0,0 +1,4 @@ +# Default ignored files +/shelf/ +/workspace.xml +.idea From ac5460a3346f911c4bfefff02cc9e322beb42f18 Mon Sep 17 00:00:00 2001 From: jeanfern5 Date: Sun, 28 Apr 2024 09:48:20 -0700 Subject: [PATCH 04/40] Chapter 3 Lecture 1: Thread Creation --- .../build.gradle | 0 .../gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 .../gradlew | 0 .../gradlew.bat | 0 .../settings.gradle | 0 .../src/main/java/Main.java | 0 7 files changed, 0 insertions(+), 0 deletions(-) rename chapter_3/{lecture_1_Thread-Creation => lecture_1:Thread-Creation}/build.gradle (100%) rename chapter_3/{lecture_1_Thread-Creation => lecture_1:Thread-Creation}/gradle/wrapper/gradle-wrapper.jar (100%) rename chapter_3/{lecture_1_Thread-Creation => lecture_1:Thread-Creation}/gradle/wrapper/gradle-wrapper.properties (100%) rename chapter_3/{lecture_1_Thread-Creation => lecture_1:Thread-Creation}/gradlew (100%) rename chapter_3/{lecture_1_Thread-Creation => lecture_1:Thread-Creation}/gradlew.bat (100%) rename chapter_3/{lecture_1_Thread-Creation => lecture_1:Thread-Creation}/settings.gradle (100%) rename chapter_3/{lecture_1_Thread-Creation => lecture_1:Thread-Creation}/src/main/java/Main.java (100%) diff --git a/chapter_3/lecture_1_Thread-Creation/build.gradle b/chapter_3/lecture_1:Thread-Creation/build.gradle similarity index 100% rename from chapter_3/lecture_1_Thread-Creation/build.gradle rename to chapter_3/lecture_1:Thread-Creation/build.gradle diff --git a/chapter_3/lecture_1_Thread-Creation/gradle/wrapper/gradle-wrapper.jar b/chapter_3/lecture_1:Thread-Creation/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from chapter_3/lecture_1_Thread-Creation/gradle/wrapper/gradle-wrapper.jar rename to chapter_3/lecture_1:Thread-Creation/gradle/wrapper/gradle-wrapper.jar diff --git a/chapter_3/lecture_1_Thread-Creation/gradle/wrapper/gradle-wrapper.properties b/chapter_3/lecture_1:Thread-Creation/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from chapter_3/lecture_1_Thread-Creation/gradle/wrapper/gradle-wrapper.properties rename to chapter_3/lecture_1:Thread-Creation/gradle/wrapper/gradle-wrapper.properties diff --git a/chapter_3/lecture_1_Thread-Creation/gradlew b/chapter_3/lecture_1:Thread-Creation/gradlew similarity index 100% rename from chapter_3/lecture_1_Thread-Creation/gradlew rename to chapter_3/lecture_1:Thread-Creation/gradlew diff --git a/chapter_3/lecture_1_Thread-Creation/gradlew.bat b/chapter_3/lecture_1:Thread-Creation/gradlew.bat similarity index 100% rename from chapter_3/lecture_1_Thread-Creation/gradlew.bat rename to chapter_3/lecture_1:Thread-Creation/gradlew.bat diff --git a/chapter_3/lecture_1_Thread-Creation/settings.gradle b/chapter_3/lecture_1:Thread-Creation/settings.gradle similarity index 100% rename from chapter_3/lecture_1_Thread-Creation/settings.gradle rename to chapter_3/lecture_1:Thread-Creation/settings.gradle diff --git a/chapter_3/lecture_1_Thread-Creation/src/main/java/Main.java b/chapter_3/lecture_1:Thread-Creation/src/main/java/Main.java similarity index 100% rename from chapter_3/lecture_1_Thread-Creation/src/main/java/Main.java rename to chapter_3/lecture_1:Thread-Creation/src/main/java/Main.java From b1958b01c17d9f0dcdde92437b51b3bff8030887 Mon Sep 17 00:00:00 2001 From: jeanfern5 Date: Sun, 28 Apr 2024 09:48:51 -0700 Subject: [PATCH 05/40] Chapter 3 Lecture 2: Thread Priority and States --- .../build.gradle | 0 .../gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 .../gradlew | 0 .../gradlew.bat | 0 .../settings.gradle | 0 .../src/main/java/Main.java | 0 7 files changed, 0 insertions(+), 0 deletions(-) rename chapter_3/{lecture_2-Thread-Priorities-and-States => lecture_2:Thread-Priorities-and-States}/build.gradle (100%) rename chapter_3/{lecture_2-Thread-Priorities-and-States => lecture_2:Thread-Priorities-and-States}/gradle/wrapper/gradle-wrapper.jar (100%) rename chapter_3/{lecture_2-Thread-Priorities-and-States => lecture_2:Thread-Priorities-and-States}/gradle/wrapper/gradle-wrapper.properties (100%) rename chapter_3/{lecture_2-Thread-Priorities-and-States => lecture_2:Thread-Priorities-and-States}/gradlew (100%) rename chapter_3/{lecture_2-Thread-Priorities-and-States => lecture_2:Thread-Priorities-and-States}/gradlew.bat (100%) rename chapter_3/{lecture_2-Thread-Priorities-and-States => lecture_2:Thread-Priorities-and-States}/settings.gradle (100%) rename chapter_3/{lecture_2-Thread-Priorities-and-States => lecture_2:Thread-Priorities-and-States}/src/main/java/Main.java (100%) diff --git a/chapter_3/lecture_2-Thread-Priorities-and-States/build.gradle b/chapter_3/lecture_2:Thread-Priorities-and-States/build.gradle similarity index 100% rename from chapter_3/lecture_2-Thread-Priorities-and-States/build.gradle rename to chapter_3/lecture_2:Thread-Priorities-and-States/build.gradle diff --git a/chapter_3/lecture_2-Thread-Priorities-and-States/gradle/wrapper/gradle-wrapper.jar b/chapter_3/lecture_2:Thread-Priorities-and-States/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from chapter_3/lecture_2-Thread-Priorities-and-States/gradle/wrapper/gradle-wrapper.jar rename to chapter_3/lecture_2:Thread-Priorities-and-States/gradle/wrapper/gradle-wrapper.jar diff --git a/chapter_3/lecture_2-Thread-Priorities-and-States/gradle/wrapper/gradle-wrapper.properties b/chapter_3/lecture_2:Thread-Priorities-and-States/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from chapter_3/lecture_2-Thread-Priorities-and-States/gradle/wrapper/gradle-wrapper.properties rename to chapter_3/lecture_2:Thread-Priorities-and-States/gradle/wrapper/gradle-wrapper.properties diff --git a/chapter_3/lecture_2-Thread-Priorities-and-States/gradlew b/chapter_3/lecture_2:Thread-Priorities-and-States/gradlew similarity index 100% rename from chapter_3/lecture_2-Thread-Priorities-and-States/gradlew rename to chapter_3/lecture_2:Thread-Priorities-and-States/gradlew diff --git a/chapter_3/lecture_2-Thread-Priorities-and-States/gradlew.bat b/chapter_3/lecture_2:Thread-Priorities-and-States/gradlew.bat similarity index 100% rename from chapter_3/lecture_2-Thread-Priorities-and-States/gradlew.bat rename to chapter_3/lecture_2:Thread-Priorities-and-States/gradlew.bat diff --git a/chapter_3/lecture_2-Thread-Priorities-and-States/settings.gradle b/chapter_3/lecture_2:Thread-Priorities-and-States/settings.gradle similarity index 100% rename from chapter_3/lecture_2-Thread-Priorities-and-States/settings.gradle rename to chapter_3/lecture_2:Thread-Priorities-and-States/settings.gradle diff --git a/chapter_3/lecture_2-Thread-Priorities-and-States/src/main/java/Main.java b/chapter_3/lecture_2:Thread-Priorities-and-States/src/main/java/Main.java similarity index 100% rename from chapter_3/lecture_2-Thread-Priorities-and-States/src/main/java/Main.java rename to chapter_3/lecture_2:Thread-Priorities-and-States/src/main/java/Main.java From 63c8e62070a4a9f239ab6cd66aa6ff1c2c874227 Mon Sep 17 00:00:00 2001 From: jeanfern5 Date: Sun, 28 Apr 2024 09:50:11 -0700 Subject: [PATCH 06/40] Chapter 3 Lecture 3: Thread Groups --- chapter_3/lecture_3/src/main/java/Main.java | 38 ------------ .../build.gradle | 0 .../gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 .../gradlew | 0 .../gradlew.bat | 0 .../settings.gradle | 0 .../src/main/java/Main.java | 56 ++++++++++++++++++ 8 files changed, 56 insertions(+), 38 deletions(-) delete mode 100644 chapter_3/lecture_3/src/main/java/Main.java rename chapter_3/{lecture_3 => lecture_3:Thread-Groups}/build.gradle (100%) rename chapter_3/{lecture_3 => lecture_3:Thread-Groups}/gradle/wrapper/gradle-wrapper.jar (100%) rename chapter_3/{lecture_3 => lecture_3:Thread-Groups}/gradle/wrapper/gradle-wrapper.properties (100%) rename chapter_3/{lecture_3 => lecture_3:Thread-Groups}/gradlew (100%) rename chapter_3/{lecture_3 => lecture_3:Thread-Groups}/gradlew.bat (100%) rename chapter_3/{lecture_3 => lecture_3:Thread-Groups}/settings.gradle (100%) create mode 100644 chapter_3/lecture_3:Thread-Groups/src/main/java/Main.java diff --git a/chapter_3/lecture_3/src/main/java/Main.java b/chapter_3/lecture_3/src/main/java/Main.java deleted file mode 100644 index 46bb1e1..0000000 --- a/chapter_3/lecture_3/src/main/java/Main.java +++ /dev/null @@ -1,38 +0,0 @@ -public class Main { - public static void main(String[] args) throws InterruptedException { - ThreadGroup group1 = new ThreadGroup("Group1"); - group1.setMaxPriority(7); - - ThreadGroup parent = group1.getParent(); - System.out.println("Parent name: " + parent.getName() + " priority = " + parent.getMaxPriority()); - - Thread thread1 = new Thread(group1, new MyThread(), "Thread1"); - Thread thread2 = new Thread(group1, new MyThread(), "Thread2"); - Thread thread3 = new Thread(group1, new MyThread(), "Thread3"); - - thread1.setPriority(Thread.MAX_PRIORITY); - - thread1.start(); - thread2.start(); - thread3.start(); - - System.out.println("Sleeping for 3 seconds..."); - Thread.sleep(3000); - - group1.interrupt(); - } - - static class MyThread implements Runnable { - @Override - public void run() { - while(true) { - try { - Thread.sleep(3000); - } catch (InterruptedException e) { - Thread currentThread = Thread.currentThread(); - System.out.println("Name: " + currentThread.getName() + " priority = " + currentThread.getPriority()); - } - } - } - } -} diff --git a/chapter_3/lecture_3/build.gradle b/chapter_3/lecture_3:Thread-Groups/build.gradle similarity index 100% rename from chapter_3/lecture_3/build.gradle rename to chapter_3/lecture_3:Thread-Groups/build.gradle diff --git a/chapter_3/lecture_3/gradle/wrapper/gradle-wrapper.jar b/chapter_3/lecture_3:Thread-Groups/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from chapter_3/lecture_3/gradle/wrapper/gradle-wrapper.jar rename to chapter_3/lecture_3:Thread-Groups/gradle/wrapper/gradle-wrapper.jar diff --git a/chapter_3/lecture_3/gradle/wrapper/gradle-wrapper.properties b/chapter_3/lecture_3:Thread-Groups/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from chapter_3/lecture_3/gradle/wrapper/gradle-wrapper.properties rename to chapter_3/lecture_3:Thread-Groups/gradle/wrapper/gradle-wrapper.properties diff --git a/chapter_3/lecture_3/gradlew b/chapter_3/lecture_3:Thread-Groups/gradlew similarity index 100% rename from chapter_3/lecture_3/gradlew rename to chapter_3/lecture_3:Thread-Groups/gradlew diff --git a/chapter_3/lecture_3/gradlew.bat b/chapter_3/lecture_3:Thread-Groups/gradlew.bat similarity index 100% rename from chapter_3/lecture_3/gradlew.bat rename to chapter_3/lecture_3:Thread-Groups/gradlew.bat diff --git a/chapter_3/lecture_3/settings.gradle b/chapter_3/lecture_3:Thread-Groups/settings.gradle similarity index 100% rename from chapter_3/lecture_3/settings.gradle rename to chapter_3/lecture_3:Thread-Groups/settings.gradle diff --git a/chapter_3/lecture_3:Thread-Groups/src/main/java/Main.java b/chapter_3/lecture_3:Thread-Groups/src/main/java/Main.java new file mode 100644 index 0000000..df53540 --- /dev/null +++ b/chapter_3/lecture_3:Thread-Groups/src/main/java/Main.java @@ -0,0 +1,56 @@ +// Chapter 3 Lecture 3: Thread Groups +class Ch3_Lect3 { + public static void main(String[] args) throws InterruptedException { +// Thread thread1 = new Thread(() -> System.out.println("Thread1")); +// Thread thread2 = new Thread(() -> System.out.println("Thread2")); +// Thread thread3 = new Thread(() -> System.out.println("Thread3")); +// thread1.start(); +// // ... +// thread1.join(); +// // .. + +// // Instead of above we can be managed by ThreadGroups +// ThreadGroup subGroup = new ThreadGroup("subGroup"); +// ThreadGroup rootGroup = new ThreadGroup(subGroup, "Group1"); // creates child/parent relation +// rootGroup.getParent(); + + // ThreadGroups help manage multiple threads as once + ThreadGroup group1 = new ThreadGroup("Group1"); + + ThreadGroup parent = group1.getParent(); + System.out.println("Parent name: " + parent.getName() + " priority = " + parent.getMaxPriority()); + + group1.setMaxPriority(7); // sets boundary for subgroup threads + + Thread thread1 = new Thread(group1, new MyThread(), "Thread1"); + Thread thread2 = new Thread(group1, new MyThread(), "Thread2"); + Thread thread3 = new Thread(group1, new MyThread(), "Thread3"); + + thread1.setPriority(Thread.MAX_PRIORITY); // will be reduced to groups max priority + + thread1.start(); + thread2.start(); + thread3.start(); + + System.out.println("Sleeping for 3 seconds..."); + Thread.sleep(3000); + +// +// thread1.interrupt(); // lets the thread exit WAITING state + group1.interrupt(); // applies to the whole group fo thread + } + + static class MyThread implements Runnable { + @Override + public void run() { + while (true) { + try { + Thread.sleep(3000); + } catch (InterruptedException e) { + Thread currentThread = Thread.currentThread(); + System.out.println("Name: " + currentThread.getName() + " priority = " + currentThread.getPriority()); + } + } + } + } +} From 0fc171f8862ba74d46a92f8061d947e220120351 Mon Sep 17 00:00:00 2001 From: jeanfern5 Date: Sun, 28 Apr 2024 09:53:19 -0700 Subject: [PATCH 07/40] // Chapter 3 Lecture 4: Daemon Threads and User Threads --- .../build.gradle | 0 .../gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 .../gradlew | 0 .../gradlew.bat | 0 .../settings.gradle | 0 .../src/main/java/Main.java | 23 ++++++++++-------- 7 files changed, 13 insertions(+), 10 deletions(-) rename chapter_3/{lecture_4 => lecture_4:Daemon-and-User-Threads}/build.gradle (100%) rename chapter_3/{lecture_4 => lecture_4:Daemon-and-User-Threads}/gradle/wrapper/gradle-wrapper.jar (100%) rename chapter_3/{lecture_4 => lecture_4:Daemon-and-User-Threads}/gradle/wrapper/gradle-wrapper.properties (100%) rename chapter_3/{lecture_4 => lecture_4:Daemon-and-User-Threads}/gradlew (100%) rename chapter_3/{lecture_4 => lecture_4:Daemon-and-User-Threads}/gradlew.bat (100%) rename chapter_3/{lecture_4 => lecture_4:Daemon-and-User-Threads}/settings.gradle (100%) rename chapter_3/{lecture_4 => lecture_4:Daemon-and-User-Threads}/src/main/java/Main.java (51%) diff --git a/chapter_3/lecture_4/build.gradle b/chapter_3/lecture_4:Daemon-and-User-Threads/build.gradle similarity index 100% rename from chapter_3/lecture_4/build.gradle rename to chapter_3/lecture_4:Daemon-and-User-Threads/build.gradle diff --git a/chapter_3/lecture_4/gradle/wrapper/gradle-wrapper.jar b/chapter_3/lecture_4:Daemon-and-User-Threads/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from chapter_3/lecture_4/gradle/wrapper/gradle-wrapper.jar rename to chapter_3/lecture_4:Daemon-and-User-Threads/gradle/wrapper/gradle-wrapper.jar diff --git a/chapter_3/lecture_4/gradle/wrapper/gradle-wrapper.properties b/chapter_3/lecture_4:Daemon-and-User-Threads/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from chapter_3/lecture_4/gradle/wrapper/gradle-wrapper.properties rename to chapter_3/lecture_4:Daemon-and-User-Threads/gradle/wrapper/gradle-wrapper.properties diff --git a/chapter_3/lecture_4/gradlew b/chapter_3/lecture_4:Daemon-and-User-Threads/gradlew similarity index 100% rename from chapter_3/lecture_4/gradlew rename to chapter_3/lecture_4:Daemon-and-User-Threads/gradlew diff --git a/chapter_3/lecture_4/gradlew.bat b/chapter_3/lecture_4:Daemon-and-User-Threads/gradlew.bat similarity index 100% rename from chapter_3/lecture_4/gradlew.bat rename to chapter_3/lecture_4:Daemon-and-User-Threads/gradlew.bat diff --git a/chapter_3/lecture_4/settings.gradle b/chapter_3/lecture_4:Daemon-and-User-Threads/settings.gradle similarity index 100% rename from chapter_3/lecture_4/settings.gradle rename to chapter_3/lecture_4:Daemon-and-User-Threads/settings.gradle diff --git a/chapter_3/lecture_4/src/main/java/Main.java b/chapter_3/lecture_4:Daemon-and-User-Threads/src/main/java/Main.java similarity index 51% rename from chapter_3/lecture_4/src/main/java/Main.java rename to chapter_3/lecture_4:Daemon-and-User-Threads/src/main/java/Main.java index 8fd4627..c8e1a4d 100644 --- a/chapter_3/lecture_4/src/main/java/Main.java +++ b/chapter_3/lecture_4:Daemon-and-User-Threads/src/main/java/Main.java @@ -1,21 +1,25 @@ -public class Main { +// Chapter 3 Lecture 4: Daemon Threads and User Threads +public class ch3_lect4 { public static void main(String[] args) throws InterruptedException { - Thread thread1 = new Thread(new MyThread(10), "Thread1"); - Thread thread2 = new Thread(new MyThread(3), "Thread2"); + Thread thread1 = new Thread(new MyThread(10), "Thread1"); // converted to daemon thread + Thread thread2 = new Thread(new MyThread(3), "Thread2"); // user thread - thread1.setDaemon(true); + // considered low priority by jvm + // not required to be completed before the jvm exits + // in this example, thread1 will exit with thread2 finishes + thread1.setDaemon(true); // daemon thread thread1.start(); thread2.start(); + // joining daemon thread will make the jvm to wait until the thread is complete (user thread like) + // example above, thread1 will print all 10 seconds thread1.join(); - thread2.join(); } static class MyThread implements Runnable { private final int numberOfSeconds; - - public MyThread(int numberOfSeconds) { + public MyThread (int numberOfSeconds) { this.numberOfSeconds = numberOfSeconds; } @@ -23,12 +27,11 @@ public MyThread(int numberOfSeconds) { public void run() { for (int i = 0; i < numberOfSeconds; i++) { try { - System.out.println("Sleeping for 1s, thread: " + Thread.currentThread().getName()); + System.out.println("Sleeping for 1 second, thread: " + Thread.currentThread().getName()); Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } - } -} + }} \ No newline at end of file From 2b732d91ab8163a4cfb38d1efb59ab946d73eecf Mon Sep 17 00:00:00 2001 From: jeanfern5 Date: Sun, 28 Apr 2024 09:54:35 -0700 Subject: [PATCH 08/40] // Chapter 3 Lecture 4: Daemon Threads and User Threads --- .../build.gradle | 0 .../gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 .../gradlew | 0 .../gradlew.bat | 0 .../settings.gradle | 0 .../src/main/java/Main.java | 28 +++++++++--------- 7 files changed, 14 insertions(+), 14 deletions(-) rename chapter_3/{lecture_5 => lecture_5:Thread-Exception-Handling}/build.gradle (100%) rename chapter_3/{lecture_5 => lecture_5:Thread-Exception-Handling}/gradle/wrapper/gradle-wrapper.jar (100%) rename chapter_3/{lecture_5 => lecture_5:Thread-Exception-Handling}/gradle/wrapper/gradle-wrapper.properties (100%) rename chapter_3/{lecture_5 => lecture_5:Thread-Exception-Handling}/gradlew (100%) rename chapter_3/{lecture_5 => lecture_5:Thread-Exception-Handling}/gradlew.bat (100%) rename chapter_3/{lecture_5 => lecture_5:Thread-Exception-Handling}/settings.gradle (100%) rename chapter_3/{lecture_5 => lecture_5:Thread-Exception-Handling}/src/main/java/Main.java (59%) diff --git a/chapter_3/lecture_5/build.gradle b/chapter_3/lecture_5:Thread-Exception-Handling/build.gradle similarity index 100% rename from chapter_3/lecture_5/build.gradle rename to chapter_3/lecture_5:Thread-Exception-Handling/build.gradle diff --git a/chapter_3/lecture_5/gradle/wrapper/gradle-wrapper.jar b/chapter_3/lecture_5:Thread-Exception-Handling/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from chapter_3/lecture_5/gradle/wrapper/gradle-wrapper.jar rename to chapter_3/lecture_5:Thread-Exception-Handling/gradle/wrapper/gradle-wrapper.jar diff --git a/chapter_3/lecture_5/gradle/wrapper/gradle-wrapper.properties b/chapter_3/lecture_5:Thread-Exception-Handling/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from chapter_3/lecture_5/gradle/wrapper/gradle-wrapper.properties rename to chapter_3/lecture_5:Thread-Exception-Handling/gradle/wrapper/gradle-wrapper.properties diff --git a/chapter_3/lecture_5/gradlew b/chapter_3/lecture_5:Thread-Exception-Handling/gradlew similarity index 100% rename from chapter_3/lecture_5/gradlew rename to chapter_3/lecture_5:Thread-Exception-Handling/gradlew diff --git a/chapter_3/lecture_5/gradlew.bat b/chapter_3/lecture_5:Thread-Exception-Handling/gradlew.bat similarity index 100% rename from chapter_3/lecture_5/gradlew.bat rename to chapter_3/lecture_5:Thread-Exception-Handling/gradlew.bat diff --git a/chapter_3/lecture_5/settings.gradle b/chapter_3/lecture_5:Thread-Exception-Handling/settings.gradle similarity index 100% rename from chapter_3/lecture_5/settings.gradle rename to chapter_3/lecture_5:Thread-Exception-Handling/settings.gradle diff --git a/chapter_3/lecture_5/src/main/java/Main.java b/chapter_3/lecture_5:Thread-Exception-Handling/src/main/java/Main.java similarity index 59% rename from chapter_3/lecture_5/src/main/java/Main.java rename to chapter_3/lecture_5:Thread-Exception-Handling/src/main/java/Main.java index 4386b65..2ce2a78 100644 --- a/chapter_3/lecture_5/src/main/java/Main.java +++ b/chapter_3/lecture_5:Thread-Exception-Handling/src/main/java/Main.java @@ -1,16 +1,17 @@ import java.util.List; -public class Main { +// Chapter 3 Lecture 5 - Thread Exception Handling +public class Ch3_Lect5 { public static void main(String[] args) throws InterruptedException { - Thread thread1 = new Thread(new CustomThreadGroup("group1"), new MyThread(1), "Thread1"); + Thread thread1 = new Thread(new MyThread(1), "Thread1"); - Thread.setDefaultUncaughtExceptionHandler((Thread t, Throwable exception) -> { - System.out.println(exception.getMessage()); - }); + Thread.setDefaultUncaughtExceptionHandler( + (Thread t, Throwable exception) -> System.out.println(exception.getMessage()) + ); -// thread1.setUncaughtExceptionHandler((Thread t, Throwable exception) -> { -// System.out.println(exception.getMessage()); -// }); + thread1.setUncaughtExceptionHandler( + (Thread t, Throwable exception) -> System.out.println(exception.getMessage()) + ); thread1.start(); thread1.join(); @@ -29,22 +30,21 @@ public CustomThreadGroup(ThreadGroup parent, String name) { @Override public void uncaughtException(Thread t, Throwable e) { super.uncaughtException(t, e); - System.out.println(e.getMessage()); + System.out.println("Thread: "+ t + e.getMessage()); } } static class MyThread implements Runnable { private final int numberOfSeconds; - - public MyThread(int numberOfSeconds) { + public MyThread (int numberOfSeconds) { this.numberOfSeconds = numberOfSeconds; } @Override public void run() { - for(int i = 0; i < numberOfSeconds; i++) { + for (int i = 0; i < numberOfSeconds; i++) { try { - System.out.println("Sleeping for 1s, thread: " + Thread.currentThread().getName()); + System.out.println("Sleeping for 1 second, thread: " + Thread.currentThread().getName()); Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); @@ -56,4 +56,4 @@ public void run() { System.out.println("Result: " + (4 / 0)); } } -} +} \ No newline at end of file From 39c753aeee81ffbf1ec0346c407566214322b904 Mon Sep 17 00:00:00 2001 From: jeanfern5 Date: Sun, 28 Apr 2024 09:56:08 -0700 Subject: [PATCH 09/40] Chapter 3 Lecture 6: Thread Local Variables and Race Conditions --- .../build.gradle | 0 .../gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 .../gradlew | 0 .../gradlew.bat | 0 .../settings.gradle | 0 .../src/main/java/Main.java | 29 +++++++++++++----- 7 files changed, 22 insertions(+), 7 deletions(-) rename chapter_3/{lecture_6 => lecture_6:Thread-Local-Variables-and-Race-Conditions}/build.gradle (100%) rename chapter_3/{lecture_6 => lecture_6:Thread-Local-Variables-and-Race-Conditions}/gradle/wrapper/gradle-wrapper.jar (100%) rename chapter_3/{lecture_6 => lecture_6:Thread-Local-Variables-and-Race-Conditions}/gradle/wrapper/gradle-wrapper.properties (100%) rename chapter_3/{lecture_6 => lecture_6:Thread-Local-Variables-and-Race-Conditions}/gradlew (100%) rename chapter_3/{lecture_6 => lecture_6:Thread-Local-Variables-and-Race-Conditions}/gradlew.bat (100%) rename chapter_3/{lecture_6 => lecture_6:Thread-Local-Variables-and-Race-Conditions}/settings.gradle (100%) rename chapter_3/{lecture_6 => lecture_6:Thread-Local-Variables-and-Race-Conditions}/src/main/java/Main.java (60%) diff --git a/chapter_3/lecture_6/build.gradle b/chapter_3/lecture_6:Thread-Local-Variables-and-Race-Conditions/build.gradle similarity index 100% rename from chapter_3/lecture_6/build.gradle rename to chapter_3/lecture_6:Thread-Local-Variables-and-Race-Conditions/build.gradle diff --git a/chapter_3/lecture_6/gradle/wrapper/gradle-wrapper.jar b/chapter_3/lecture_6:Thread-Local-Variables-and-Race-Conditions/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from chapter_3/lecture_6/gradle/wrapper/gradle-wrapper.jar rename to chapter_3/lecture_6:Thread-Local-Variables-and-Race-Conditions/gradle/wrapper/gradle-wrapper.jar diff --git a/chapter_3/lecture_6/gradle/wrapper/gradle-wrapper.properties b/chapter_3/lecture_6:Thread-Local-Variables-and-Race-Conditions/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from chapter_3/lecture_6/gradle/wrapper/gradle-wrapper.properties rename to chapter_3/lecture_6:Thread-Local-Variables-and-Race-Conditions/gradle/wrapper/gradle-wrapper.properties diff --git a/chapter_3/lecture_6/gradlew b/chapter_3/lecture_6:Thread-Local-Variables-and-Race-Conditions/gradlew similarity index 100% rename from chapter_3/lecture_6/gradlew rename to chapter_3/lecture_6:Thread-Local-Variables-and-Race-Conditions/gradlew diff --git a/chapter_3/lecture_6/gradlew.bat b/chapter_3/lecture_6:Thread-Local-Variables-and-Race-Conditions/gradlew.bat similarity index 100% rename from chapter_3/lecture_6/gradlew.bat rename to chapter_3/lecture_6:Thread-Local-Variables-and-Race-Conditions/gradlew.bat diff --git a/chapter_3/lecture_6/settings.gradle b/chapter_3/lecture_6:Thread-Local-Variables-and-Race-Conditions/settings.gradle similarity index 100% rename from chapter_3/lecture_6/settings.gradle rename to chapter_3/lecture_6:Thread-Local-Variables-and-Race-Conditions/settings.gradle diff --git a/chapter_3/lecture_6/src/main/java/Main.java b/chapter_3/lecture_6:Thread-Local-Variables-and-Race-Conditions/src/main/java/Main.java similarity index 60% rename from chapter_3/lecture_6/src/main/java/Main.java rename to chapter_3/lecture_6:Thread-Local-Variables-and-Race-Conditions/src/main/java/Main.java index 0bba3b5..1bdcfe4 100644 --- a/chapter_3/lecture_6/src/main/java/Main.java +++ b/chapter_3/lecture_6:Thread-Local-Variables-and-Race-Conditions/src/main/java/Main.java @@ -1,8 +1,9 @@ +// Chapter 3 Lecture 6: Thread Local Variables and Race Conditions + import java.util.ArrayList; import java.util.List; -public class Main { - +public class Ch3_Lect6 { private static int globalCounter = 0; public static void main(String[] args) { @@ -11,7 +12,7 @@ public static void main(String[] args) { ThreadGroup group = new ThreadGroup("Group1"); for (int i = 1; i<=1000; i++) { - Thread t = new Thread(group, new MyThread()); + Thread t = new Thread(new MyThread()); t.start(); threads.add(t); } @@ -33,26 +34,37 @@ static class MyThread implements Runnable { @Override public void run() { try { - Thread.sleep(99999); - } catch (InterruptedException e) { + Thread.sleep(9999); + } catch (InterruptedException ignored) { } + globalCounter++; +// // Race Condition issue!! +// // problem with this is that if multiple threads share a global variable and read variable value the same +// // example: running 3 threads, where thread 1 and 3 both read the globalCounter=1, +// // then both threads increment globalCounter to 2 instead of 3 (1 -> thread1++1 -> thread3++1 -> 3) +// // race condition behaviour: (1 -> thread1++1 -> [2] +// // 1 -> thread3++1 -> [2]) +// // expected behaviour: (1 -> thread1++1 -> 2 -> thread3++1 -> [3]) // int localCounter = globalCounter; // localCounter = localCounter + 1; // globalCounter = localCounter; + } } +// private static ThreadLocal threadLocal = new ThreadLocal<>(); // private static ThreadLocal threadLocal = ThreadLocal.withInitial(() -> "initialValue"); -// + // public static void main(String[] args) { // Thread t1 = new Thread(new MyThread()); // Thread t2 = new Thread(new MyThread()); // // t1.start(); // t2.start(); +// // } // // static class MyThread implements Runnable { @@ -62,6 +74,9 @@ public void run() { // // threadLocal.set("myValue"); // threadLocal.get(); +// +// System.out.println("ThreadLocal: " + threadLocal.get()); // } // } -} + +} \ No newline at end of file From da8bc607f83871bc0f6fc431cf42fd2759eb62e9 Mon Sep 17 00:00:00 2001 From: jeanfern5 Date: Sun, 28 Apr 2024 13:01:41 -0700 Subject: [PATCH 10/40] fix directory name for Chapter 3, Lecture 1 - 6 --- .../build.gradle | 0 .../gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 .../gradlew | 0 .../gradlew.bat | 0 .../settings.gradle | 0 .../src/main/java/Main.java | 0 .../build.gradle | 0 .../gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 .../gradlew | 0 .../gradlew.bat | 0 .../settings.gradle | 0 .../src/main/java/Main.java | 2 +- .../build.gradle | 0 .../gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 .../gradlew | 0 .../gradlew.bat | 0 .../settings.gradle | 0 .../src/main/java/Main.java | 2 +- .../build.gradle | 0 .../gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 .../gradlew | 0 .../gradlew.bat | 0 .../settings.gradle | 0 .../src/main/java/Main.java | 2 +- .../build.gradle | 0 .../gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 .../gradlew | 0 .../gradlew.bat | 0 .../settings.gradle | 0 .../src/main/java/Main.java | 2 +- .../.idea/.gitignore | 4 ---- .../build.gradle | 0 .../gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 .../gradlew | 0 .../gradlew.bat | 0 .../settings.gradle | 0 .../src/main/java/Main.java | 2 +- 43 files changed, 5 insertions(+), 9 deletions(-) rename chapter_3/{lecture_1:Thread-Creation => lecture_1_thread_creation}/build.gradle (100%) rename chapter_3/{lecture_1:Thread-Creation => lecture_1_thread_creation}/gradle/wrapper/gradle-wrapper.jar (100%) rename chapter_3/{lecture_1:Thread-Creation => lecture_1_thread_creation}/gradle/wrapper/gradle-wrapper.properties (100%) rename chapter_3/{lecture_1:Thread-Creation => lecture_1_thread_creation}/gradlew (100%) rename chapter_3/{lecture_1:Thread-Creation => lecture_1_thread_creation}/gradlew.bat (100%) rename chapter_3/{lecture_1:Thread-Creation => lecture_1_thread_creation}/settings.gradle (100%) rename chapter_3/{lecture_1:Thread-Creation => lecture_1_thread_creation}/src/main/java/Main.java (100%) rename chapter_3/{lecture_2:Thread-Priorities-and-States => lecture_2_thread_priorities_and_state}/build.gradle (100%) rename chapter_3/{lecture_2:Thread-Priorities-and-States => lecture_2_thread_priorities_and_state}/gradle/wrapper/gradle-wrapper.jar (100%) rename chapter_3/{lecture_2:Thread-Priorities-and-States => lecture_2_thread_priorities_and_state}/gradle/wrapper/gradle-wrapper.properties (100%) rename chapter_3/{lecture_2:Thread-Priorities-and-States => lecture_2_thread_priorities_and_state}/gradlew (100%) rename chapter_3/{lecture_2:Thread-Priorities-and-States => lecture_2_thread_priorities_and_state}/gradlew.bat (100%) rename chapter_3/{lecture_2:Thread-Priorities-and-States => lecture_2_thread_priorities_and_state}/settings.gradle (100%) rename chapter_3/{lecture_2:Thread-Priorities-and-States => lecture_2_thread_priorities_and_state}/src/main/java/Main.java (98%) rename chapter_3/{lecture_3:Thread-Groups => lecture_3_thread_groups}/build.gradle (100%) rename chapter_3/{lecture_3:Thread-Groups => lecture_3_thread_groups}/gradle/wrapper/gradle-wrapper.jar (100%) rename chapter_3/{lecture_3:Thread-Groups => lecture_3_thread_groups}/gradle/wrapper/gradle-wrapper.properties (100%) rename chapter_3/{lecture_3:Thread-Groups => lecture_3_thread_groups}/gradlew (100%) rename chapter_3/{lecture_3:Thread-Groups => lecture_3_thread_groups}/gradlew.bat (100%) rename chapter_3/{lecture_3:Thread-Groups => lecture_3_thread_groups}/settings.gradle (100%) rename chapter_3/{lecture_3:Thread-Groups => lecture_3_thread_groups}/src/main/java/Main.java (99%) rename chapter_3/{lecture_4:Daemon-and-User-Threads => lecture_4_daemon_and_user_threads}/build.gradle (100%) rename chapter_3/{lecture_4:Daemon-and-User-Threads => lecture_4_daemon_and_user_threads}/gradle/wrapper/gradle-wrapper.jar (100%) rename chapter_3/{lecture_4:Daemon-and-User-Threads => lecture_4_daemon_and_user_threads}/gradle/wrapper/gradle-wrapper.properties (100%) rename chapter_3/{lecture_4:Daemon-and-User-Threads => lecture_4_daemon_and_user_threads}/gradlew (100%) rename chapter_3/{lecture_4:Daemon-and-User-Threads => lecture_4_daemon_and_user_threads}/gradlew.bat (100%) rename chapter_3/{lecture_4:Daemon-and-User-Threads => lecture_4_daemon_and_user_threads}/settings.gradle (100%) rename chapter_3/{lecture_4:Daemon-and-User-Threads => lecture_4_daemon_and_user_threads}/src/main/java/Main.java (98%) rename chapter_3/{lecture_5:Thread-Exception-Handling => lecture_5_thread_exception_handling}/build.gradle (100%) rename chapter_3/{lecture_5:Thread-Exception-Handling => lecture_5_thread_exception_handling}/gradle/wrapper/gradle-wrapper.jar (100%) rename chapter_3/{lecture_5:Thread-Exception-Handling => lecture_5_thread_exception_handling}/gradle/wrapper/gradle-wrapper.properties (100%) rename chapter_3/{lecture_5:Thread-Exception-Handling => lecture_5_thread_exception_handling}/gradlew (100%) rename chapter_3/{lecture_5:Thread-Exception-Handling => lecture_5_thread_exception_handling}/gradlew.bat (100%) rename chapter_3/{lecture_5:Thread-Exception-Handling => lecture_5_thread_exception_handling}/settings.gradle (100%) rename chapter_3/{lecture_5:Thread-Exception-Handling => lecture_5_thread_exception_handling}/src/main/java/Main.java (98%) delete mode 100644 chapter_3/lecture_6-Thread-Local-Variables-and-Race-Conditions/.idea/.gitignore rename chapter_3/{lecture_6:Thread-Local-Variables-and-Race-Conditions => lecture_6_thread_local_variable_and_race_conditions}/build.gradle (100%) rename chapter_3/{lecture_6:Thread-Local-Variables-and-Race-Conditions => lecture_6_thread_local_variable_and_race_conditions}/gradle/wrapper/gradle-wrapper.jar (100%) rename chapter_3/{lecture_6:Thread-Local-Variables-and-Race-Conditions => lecture_6_thread_local_variable_and_race_conditions}/gradle/wrapper/gradle-wrapper.properties (100%) rename chapter_3/{lecture_6:Thread-Local-Variables-and-Race-Conditions => lecture_6_thread_local_variable_and_race_conditions}/gradlew (100%) rename chapter_3/{lecture_6:Thread-Local-Variables-and-Race-Conditions => lecture_6_thread_local_variable_and_race_conditions}/gradlew.bat (100%) rename chapter_3/{lecture_6:Thread-Local-Variables-and-Race-Conditions => lecture_6_thread_local_variable_and_race_conditions}/settings.gradle (100%) rename chapter_3/{lecture_6:Thread-Local-Variables-and-Race-Conditions => lecture_6_thread_local_variable_and_race_conditions}/src/main/java/Main.java (98%) diff --git a/chapter_3/lecture_1:Thread-Creation/build.gradle b/chapter_3/lecture_1_thread_creation/build.gradle similarity index 100% rename from chapter_3/lecture_1:Thread-Creation/build.gradle rename to chapter_3/lecture_1_thread_creation/build.gradle diff --git a/chapter_3/lecture_1:Thread-Creation/gradle/wrapper/gradle-wrapper.jar b/chapter_3/lecture_1_thread_creation/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from chapter_3/lecture_1:Thread-Creation/gradle/wrapper/gradle-wrapper.jar rename to chapter_3/lecture_1_thread_creation/gradle/wrapper/gradle-wrapper.jar diff --git a/chapter_3/lecture_1:Thread-Creation/gradle/wrapper/gradle-wrapper.properties b/chapter_3/lecture_1_thread_creation/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from chapter_3/lecture_1:Thread-Creation/gradle/wrapper/gradle-wrapper.properties rename to chapter_3/lecture_1_thread_creation/gradle/wrapper/gradle-wrapper.properties diff --git a/chapter_3/lecture_1:Thread-Creation/gradlew b/chapter_3/lecture_1_thread_creation/gradlew similarity index 100% rename from chapter_3/lecture_1:Thread-Creation/gradlew rename to chapter_3/lecture_1_thread_creation/gradlew diff --git a/chapter_3/lecture_1:Thread-Creation/gradlew.bat b/chapter_3/lecture_1_thread_creation/gradlew.bat similarity index 100% rename from chapter_3/lecture_1:Thread-Creation/gradlew.bat rename to chapter_3/lecture_1_thread_creation/gradlew.bat diff --git a/chapter_3/lecture_1:Thread-Creation/settings.gradle b/chapter_3/lecture_1_thread_creation/settings.gradle similarity index 100% rename from chapter_3/lecture_1:Thread-Creation/settings.gradle rename to chapter_3/lecture_1_thread_creation/settings.gradle diff --git a/chapter_3/lecture_1:Thread-Creation/src/main/java/Main.java b/chapter_3/lecture_1_thread_creation/src/main/java/Main.java similarity index 100% rename from chapter_3/lecture_1:Thread-Creation/src/main/java/Main.java rename to chapter_3/lecture_1_thread_creation/src/main/java/Main.java diff --git a/chapter_3/lecture_2:Thread-Priorities-and-States/build.gradle b/chapter_3/lecture_2_thread_priorities_and_state/build.gradle similarity index 100% rename from chapter_3/lecture_2:Thread-Priorities-and-States/build.gradle rename to chapter_3/lecture_2_thread_priorities_and_state/build.gradle diff --git a/chapter_3/lecture_2:Thread-Priorities-and-States/gradle/wrapper/gradle-wrapper.jar b/chapter_3/lecture_2_thread_priorities_and_state/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from chapter_3/lecture_2:Thread-Priorities-and-States/gradle/wrapper/gradle-wrapper.jar rename to chapter_3/lecture_2_thread_priorities_and_state/gradle/wrapper/gradle-wrapper.jar diff --git a/chapter_3/lecture_2:Thread-Priorities-and-States/gradle/wrapper/gradle-wrapper.properties b/chapter_3/lecture_2_thread_priorities_and_state/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from chapter_3/lecture_2:Thread-Priorities-and-States/gradle/wrapper/gradle-wrapper.properties rename to chapter_3/lecture_2_thread_priorities_and_state/gradle/wrapper/gradle-wrapper.properties diff --git a/chapter_3/lecture_2:Thread-Priorities-and-States/gradlew b/chapter_3/lecture_2_thread_priorities_and_state/gradlew similarity index 100% rename from chapter_3/lecture_2:Thread-Priorities-and-States/gradlew rename to chapter_3/lecture_2_thread_priorities_and_state/gradlew diff --git a/chapter_3/lecture_2:Thread-Priorities-and-States/gradlew.bat b/chapter_3/lecture_2_thread_priorities_and_state/gradlew.bat similarity index 100% rename from chapter_3/lecture_2:Thread-Priorities-and-States/gradlew.bat rename to chapter_3/lecture_2_thread_priorities_and_state/gradlew.bat diff --git a/chapter_3/lecture_2:Thread-Priorities-and-States/settings.gradle b/chapter_3/lecture_2_thread_priorities_and_state/settings.gradle similarity index 100% rename from chapter_3/lecture_2:Thread-Priorities-and-States/settings.gradle rename to chapter_3/lecture_2_thread_priorities_and_state/settings.gradle diff --git a/chapter_3/lecture_2:Thread-Priorities-and-States/src/main/java/Main.java b/chapter_3/lecture_2_thread_priorities_and_state/src/main/java/Main.java similarity index 98% rename from chapter_3/lecture_2:Thread-Priorities-and-States/src/main/java/Main.java rename to chapter_3/lecture_2_thread_priorities_and_state/src/main/java/Main.java index 50d787f..5778176 100644 --- a/chapter_3/lecture_2:Thread-Priorities-and-States/src/main/java/Main.java +++ b/chapter_3/lecture_2_thread_priorities_and_state/src/main/java/Main.java @@ -2,7 +2,7 @@ import javax.swing.plaf.TableHeaderUI; -class Scratch { +public class Main { // public static void main(String[] args) throws InterruptedException { // // main thread // Thread.currentThread().setPriority(Thread.MAX_PRIORITY); diff --git a/chapter_3/lecture_3:Thread-Groups/build.gradle b/chapter_3/lecture_3_thread_groups/build.gradle similarity index 100% rename from chapter_3/lecture_3:Thread-Groups/build.gradle rename to chapter_3/lecture_3_thread_groups/build.gradle diff --git a/chapter_3/lecture_3:Thread-Groups/gradle/wrapper/gradle-wrapper.jar b/chapter_3/lecture_3_thread_groups/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from chapter_3/lecture_3:Thread-Groups/gradle/wrapper/gradle-wrapper.jar rename to chapter_3/lecture_3_thread_groups/gradle/wrapper/gradle-wrapper.jar diff --git a/chapter_3/lecture_3:Thread-Groups/gradle/wrapper/gradle-wrapper.properties b/chapter_3/lecture_3_thread_groups/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from chapter_3/lecture_3:Thread-Groups/gradle/wrapper/gradle-wrapper.properties rename to chapter_3/lecture_3_thread_groups/gradle/wrapper/gradle-wrapper.properties diff --git a/chapter_3/lecture_3:Thread-Groups/gradlew b/chapter_3/lecture_3_thread_groups/gradlew similarity index 100% rename from chapter_3/lecture_3:Thread-Groups/gradlew rename to chapter_3/lecture_3_thread_groups/gradlew diff --git a/chapter_3/lecture_3:Thread-Groups/gradlew.bat b/chapter_3/lecture_3_thread_groups/gradlew.bat similarity index 100% rename from chapter_3/lecture_3:Thread-Groups/gradlew.bat rename to chapter_3/lecture_3_thread_groups/gradlew.bat diff --git a/chapter_3/lecture_3:Thread-Groups/settings.gradle b/chapter_3/lecture_3_thread_groups/settings.gradle similarity index 100% rename from chapter_3/lecture_3:Thread-Groups/settings.gradle rename to chapter_3/lecture_3_thread_groups/settings.gradle diff --git a/chapter_3/lecture_3:Thread-Groups/src/main/java/Main.java b/chapter_3/lecture_3_thread_groups/src/main/java/Main.java similarity index 99% rename from chapter_3/lecture_3:Thread-Groups/src/main/java/Main.java rename to chapter_3/lecture_3_thread_groups/src/main/java/Main.java index df53540..a96b40e 100644 --- a/chapter_3/lecture_3:Thread-Groups/src/main/java/Main.java +++ b/chapter_3/lecture_3_thread_groups/src/main/java/Main.java @@ -1,5 +1,5 @@ // Chapter 3 Lecture 3: Thread Groups -class Ch3_Lect3 { +public class Main { public static void main(String[] args) throws InterruptedException { // Thread thread1 = new Thread(() -> System.out.println("Thread1")); // Thread thread2 = new Thread(() -> System.out.println("Thread2")); diff --git a/chapter_3/lecture_4:Daemon-and-User-Threads/build.gradle b/chapter_3/lecture_4_daemon_and_user_threads/build.gradle similarity index 100% rename from chapter_3/lecture_4:Daemon-and-User-Threads/build.gradle rename to chapter_3/lecture_4_daemon_and_user_threads/build.gradle diff --git a/chapter_3/lecture_4:Daemon-and-User-Threads/gradle/wrapper/gradle-wrapper.jar b/chapter_3/lecture_4_daemon_and_user_threads/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from chapter_3/lecture_4:Daemon-and-User-Threads/gradle/wrapper/gradle-wrapper.jar rename to chapter_3/lecture_4_daemon_and_user_threads/gradle/wrapper/gradle-wrapper.jar diff --git a/chapter_3/lecture_4:Daemon-and-User-Threads/gradle/wrapper/gradle-wrapper.properties b/chapter_3/lecture_4_daemon_and_user_threads/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from chapter_3/lecture_4:Daemon-and-User-Threads/gradle/wrapper/gradle-wrapper.properties rename to chapter_3/lecture_4_daemon_and_user_threads/gradle/wrapper/gradle-wrapper.properties diff --git a/chapter_3/lecture_4:Daemon-and-User-Threads/gradlew b/chapter_3/lecture_4_daemon_and_user_threads/gradlew similarity index 100% rename from chapter_3/lecture_4:Daemon-and-User-Threads/gradlew rename to chapter_3/lecture_4_daemon_and_user_threads/gradlew diff --git a/chapter_3/lecture_4:Daemon-and-User-Threads/gradlew.bat b/chapter_3/lecture_4_daemon_and_user_threads/gradlew.bat similarity index 100% rename from chapter_3/lecture_4:Daemon-and-User-Threads/gradlew.bat rename to chapter_3/lecture_4_daemon_and_user_threads/gradlew.bat diff --git a/chapter_3/lecture_4:Daemon-and-User-Threads/settings.gradle b/chapter_3/lecture_4_daemon_and_user_threads/settings.gradle similarity index 100% rename from chapter_3/lecture_4:Daemon-and-User-Threads/settings.gradle rename to chapter_3/lecture_4_daemon_and_user_threads/settings.gradle diff --git a/chapter_3/lecture_4:Daemon-and-User-Threads/src/main/java/Main.java b/chapter_3/lecture_4_daemon_and_user_threads/src/main/java/Main.java similarity index 98% rename from chapter_3/lecture_4:Daemon-and-User-Threads/src/main/java/Main.java rename to chapter_3/lecture_4_daemon_and_user_threads/src/main/java/Main.java index c8e1a4d..5f8750c 100644 --- a/chapter_3/lecture_4:Daemon-and-User-Threads/src/main/java/Main.java +++ b/chapter_3/lecture_4_daemon_and_user_threads/src/main/java/Main.java @@ -1,5 +1,5 @@ // Chapter 3 Lecture 4: Daemon Threads and User Threads -public class ch3_lect4 { +public class Main { public static void main(String[] args) throws InterruptedException { Thread thread1 = new Thread(new MyThread(10), "Thread1"); // converted to daemon thread Thread thread2 = new Thread(new MyThread(3), "Thread2"); // user thread diff --git a/chapter_3/lecture_5:Thread-Exception-Handling/build.gradle b/chapter_3/lecture_5_thread_exception_handling/build.gradle similarity index 100% rename from chapter_3/lecture_5:Thread-Exception-Handling/build.gradle rename to chapter_3/lecture_5_thread_exception_handling/build.gradle diff --git a/chapter_3/lecture_5:Thread-Exception-Handling/gradle/wrapper/gradle-wrapper.jar b/chapter_3/lecture_5_thread_exception_handling/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from chapter_3/lecture_5:Thread-Exception-Handling/gradle/wrapper/gradle-wrapper.jar rename to chapter_3/lecture_5_thread_exception_handling/gradle/wrapper/gradle-wrapper.jar diff --git a/chapter_3/lecture_5:Thread-Exception-Handling/gradle/wrapper/gradle-wrapper.properties b/chapter_3/lecture_5_thread_exception_handling/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from chapter_3/lecture_5:Thread-Exception-Handling/gradle/wrapper/gradle-wrapper.properties rename to chapter_3/lecture_5_thread_exception_handling/gradle/wrapper/gradle-wrapper.properties diff --git a/chapter_3/lecture_5:Thread-Exception-Handling/gradlew b/chapter_3/lecture_5_thread_exception_handling/gradlew similarity index 100% rename from chapter_3/lecture_5:Thread-Exception-Handling/gradlew rename to chapter_3/lecture_5_thread_exception_handling/gradlew diff --git a/chapter_3/lecture_5:Thread-Exception-Handling/gradlew.bat b/chapter_3/lecture_5_thread_exception_handling/gradlew.bat similarity index 100% rename from chapter_3/lecture_5:Thread-Exception-Handling/gradlew.bat rename to chapter_3/lecture_5_thread_exception_handling/gradlew.bat diff --git a/chapter_3/lecture_5:Thread-Exception-Handling/settings.gradle b/chapter_3/lecture_5_thread_exception_handling/settings.gradle similarity index 100% rename from chapter_3/lecture_5:Thread-Exception-Handling/settings.gradle rename to chapter_3/lecture_5_thread_exception_handling/settings.gradle diff --git a/chapter_3/lecture_5:Thread-Exception-Handling/src/main/java/Main.java b/chapter_3/lecture_5_thread_exception_handling/src/main/java/Main.java similarity index 98% rename from chapter_3/lecture_5:Thread-Exception-Handling/src/main/java/Main.java rename to chapter_3/lecture_5_thread_exception_handling/src/main/java/Main.java index 2ce2a78..b317066 100644 --- a/chapter_3/lecture_5:Thread-Exception-Handling/src/main/java/Main.java +++ b/chapter_3/lecture_5_thread_exception_handling/src/main/java/Main.java @@ -1,7 +1,7 @@ import java.util.List; // Chapter 3 Lecture 5 - Thread Exception Handling -public class Ch3_Lect5 { +public class Main { public static void main(String[] args) throws InterruptedException { Thread thread1 = new Thread(new MyThread(1), "Thread1"); diff --git a/chapter_3/lecture_6-Thread-Local-Variables-and-Race-Conditions/.idea/.gitignore b/chapter_3/lecture_6-Thread-Local-Variables-and-Race-Conditions/.idea/.gitignore deleted file mode 100644 index 95b0275..0000000 --- a/chapter_3/lecture_6-Thread-Local-Variables-and-Race-Conditions/.idea/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml -.idea diff --git a/chapter_3/lecture_6:Thread-Local-Variables-and-Race-Conditions/build.gradle b/chapter_3/lecture_6_thread_local_variable_and_race_conditions/build.gradle similarity index 100% rename from chapter_3/lecture_6:Thread-Local-Variables-and-Race-Conditions/build.gradle rename to chapter_3/lecture_6_thread_local_variable_and_race_conditions/build.gradle diff --git a/chapter_3/lecture_6:Thread-Local-Variables-and-Race-Conditions/gradle/wrapper/gradle-wrapper.jar b/chapter_3/lecture_6_thread_local_variable_and_race_conditions/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from chapter_3/lecture_6:Thread-Local-Variables-and-Race-Conditions/gradle/wrapper/gradle-wrapper.jar rename to chapter_3/lecture_6_thread_local_variable_and_race_conditions/gradle/wrapper/gradle-wrapper.jar diff --git a/chapter_3/lecture_6:Thread-Local-Variables-and-Race-Conditions/gradle/wrapper/gradle-wrapper.properties b/chapter_3/lecture_6_thread_local_variable_and_race_conditions/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from chapter_3/lecture_6:Thread-Local-Variables-and-Race-Conditions/gradle/wrapper/gradle-wrapper.properties rename to chapter_3/lecture_6_thread_local_variable_and_race_conditions/gradle/wrapper/gradle-wrapper.properties diff --git a/chapter_3/lecture_6:Thread-Local-Variables-and-Race-Conditions/gradlew b/chapter_3/lecture_6_thread_local_variable_and_race_conditions/gradlew similarity index 100% rename from chapter_3/lecture_6:Thread-Local-Variables-and-Race-Conditions/gradlew rename to chapter_3/lecture_6_thread_local_variable_and_race_conditions/gradlew diff --git a/chapter_3/lecture_6:Thread-Local-Variables-and-Race-Conditions/gradlew.bat b/chapter_3/lecture_6_thread_local_variable_and_race_conditions/gradlew.bat similarity index 100% rename from chapter_3/lecture_6:Thread-Local-Variables-and-Race-Conditions/gradlew.bat rename to chapter_3/lecture_6_thread_local_variable_and_race_conditions/gradlew.bat diff --git a/chapter_3/lecture_6:Thread-Local-Variables-and-Race-Conditions/settings.gradle b/chapter_3/lecture_6_thread_local_variable_and_race_conditions/settings.gradle similarity index 100% rename from chapter_3/lecture_6:Thread-Local-Variables-and-Race-Conditions/settings.gradle rename to chapter_3/lecture_6_thread_local_variable_and_race_conditions/settings.gradle diff --git a/chapter_3/lecture_6:Thread-Local-Variables-and-Race-Conditions/src/main/java/Main.java b/chapter_3/lecture_6_thread_local_variable_and_race_conditions/src/main/java/Main.java similarity index 98% rename from chapter_3/lecture_6:Thread-Local-Variables-and-Race-Conditions/src/main/java/Main.java rename to chapter_3/lecture_6_thread_local_variable_and_race_conditions/src/main/java/Main.java index 1bdcfe4..6f77d80 100644 --- a/chapter_3/lecture_6:Thread-Local-Variables-and-Race-Conditions/src/main/java/Main.java +++ b/chapter_3/lecture_6_thread_local_variable_and_race_conditions/src/main/java/Main.java @@ -3,7 +3,7 @@ import java.util.ArrayList; import java.util.List; -public class Ch3_Lect6 { +public class Main { private static int globalCounter = 0; public static void main(String[] args) { From be00ea4a4740f93d2da63f2e936a7755d452fe1b Mon Sep 17 00:00:00 2001 From: jeanfern5 Date: Wed, 1 May 2024 18:34:31 -0700 Subject: [PATCH 11/40] Chapter 3 Lecture 7 - Project - Parallel Text File Processing --- .../build.gradle | 0 .../file1.txt_processing | 0 .../gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 .../gradlew | 0 .../gradlew.bat | 0 .../settings.gradle | 0 .../src/main/java/Main.java | 63 +++++++++++++++--- .../src/main/output/file1.txt | 0 .../src/main/output/file2.txt | 0 .../src/main/output/file3.txt | 0 .../src/main/resources/file1.txt | 0 .../src/main/resources/file2.txt | 0 .../src/main/resources/file3.txt | 0 14 files changed, 54 insertions(+), 9 deletions(-) rename chapter_3/{lecture_7 => lecture_7_project_parallel_text_file_processing}/build.gradle (100%) rename chapter_3/{lecture_7 => lecture_7_project_parallel_text_file_processing}/file1.txt_processing (100%) rename chapter_3/{lecture_7 => lecture_7_project_parallel_text_file_processing}/gradle/wrapper/gradle-wrapper.jar (100%) rename chapter_3/{lecture_7 => lecture_7_project_parallel_text_file_processing}/gradle/wrapper/gradle-wrapper.properties (100%) rename chapter_3/{lecture_7 => lecture_7_project_parallel_text_file_processing}/gradlew (100%) rename chapter_3/{lecture_7 => lecture_7_project_parallel_text_file_processing}/gradlew.bat (100%) rename chapter_3/{lecture_7 => lecture_7_project_parallel_text_file_processing}/settings.gradle (100%) rename chapter_3/{lecture_7 => lecture_7_project_parallel_text_file_processing}/src/main/java/Main.java (53%) rename chapter_3/{lecture_7 => lecture_7_project_parallel_text_file_processing}/src/main/output/file1.txt (100%) rename chapter_3/{lecture_7 => lecture_7_project_parallel_text_file_processing}/src/main/output/file2.txt (100%) rename chapter_3/{lecture_7 => lecture_7_project_parallel_text_file_processing}/src/main/output/file3.txt (100%) rename chapter_3/{lecture_7 => lecture_7_project_parallel_text_file_processing}/src/main/resources/file1.txt (100%) rename chapter_3/{lecture_7 => lecture_7_project_parallel_text_file_processing}/src/main/resources/file2.txt (100%) rename chapter_3/{lecture_7 => lecture_7_project_parallel_text_file_processing}/src/main/resources/file3.txt (100%) diff --git a/chapter_3/lecture_7/build.gradle b/chapter_3/lecture_7_project_parallel_text_file_processing/build.gradle similarity index 100% rename from chapter_3/lecture_7/build.gradle rename to chapter_3/lecture_7_project_parallel_text_file_processing/build.gradle diff --git a/chapter_3/lecture_7/file1.txt_processing b/chapter_3/lecture_7_project_parallel_text_file_processing/file1.txt_processing similarity index 100% rename from chapter_3/lecture_7/file1.txt_processing rename to chapter_3/lecture_7_project_parallel_text_file_processing/file1.txt_processing diff --git a/chapter_3/lecture_7/gradle/wrapper/gradle-wrapper.jar b/chapter_3/lecture_7_project_parallel_text_file_processing/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from chapter_3/lecture_7/gradle/wrapper/gradle-wrapper.jar rename to chapter_3/lecture_7_project_parallel_text_file_processing/gradle/wrapper/gradle-wrapper.jar diff --git a/chapter_3/lecture_7/gradle/wrapper/gradle-wrapper.properties b/chapter_3/lecture_7_project_parallel_text_file_processing/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from chapter_3/lecture_7/gradle/wrapper/gradle-wrapper.properties rename to chapter_3/lecture_7_project_parallel_text_file_processing/gradle/wrapper/gradle-wrapper.properties diff --git a/chapter_3/lecture_7/gradlew b/chapter_3/lecture_7_project_parallel_text_file_processing/gradlew similarity index 100% rename from chapter_3/lecture_7/gradlew rename to chapter_3/lecture_7_project_parallel_text_file_processing/gradlew diff --git a/chapter_3/lecture_7/gradlew.bat b/chapter_3/lecture_7_project_parallel_text_file_processing/gradlew.bat similarity index 100% rename from chapter_3/lecture_7/gradlew.bat rename to chapter_3/lecture_7_project_parallel_text_file_processing/gradlew.bat diff --git a/chapter_3/lecture_7/settings.gradle b/chapter_3/lecture_7_project_parallel_text_file_processing/settings.gradle similarity index 100% rename from chapter_3/lecture_7/settings.gradle rename to chapter_3/lecture_7_project_parallel_text_file_processing/settings.gradle diff --git a/chapter_3/lecture_7/src/main/java/Main.java b/chapter_3/lecture_7_project_parallel_text_file_processing/src/main/java/Main.java similarity index 53% rename from chapter_3/lecture_7/src/main/java/Main.java rename to chapter_3/lecture_7_project_parallel_text_file_processing/src/main/java/Main.java index 8e99313..102a1ed 100644 --- a/chapter_3/lecture_7/src/main/java/Main.java +++ b/chapter_3/lecture_7_project_parallel_text_file_processing/src/main/java/Main.java @@ -7,8 +7,7 @@ import java.nio.file.Path; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; -import java.util.Arrays; - +import java.util.*; /** * === REQUIREMENTS === * 1. Periodically scans the ./src/main/resources directory and watches for new files @@ -19,20 +18,53 @@ */ public class Main { + // local caching to track process files to not process them more than once + // Not a perfect solution due to a new thread being created per file and running in parallel + // Some files will still be re-run more than once due to race condition where a file is still being processed + // but a new thread gets created for said file before added to the map + // some potential improvements: + // 1. increase sleep timer - will give process more time to add file to map before new thread starts (reduce re-runs of the same file) + // 2. add file to map before completing the process - risk file has an error and marked as "successful" when in fact it failed (file misses) + // 3. add a "pending" state where it shows the file is in progress so that the new thread doesn't work on processing the file <---- best choice + static Map> processedFiles = new HashMap<>(); // Not a perfect solution due to race conditions + public static void main(String[] args) { - new Thread(new Watcher()).start(); + new Thread(new Watcher(processedFiles)).start(); } } class ExceptionHandler implements Thread.UncaughtExceptionHandler { + private final File file; + Map> processedFiles; + String PENDING = "pending"; + String FAILED = "failed"; + + public ExceptionHandler(Map> processedFiles, File file) { + this.processedFiles = processedFiles; + this.file = file; + } @Override public void uncaughtException(Thread t, Throwable e) { + processedFiles.get(PENDING).remove(file.getName()); + processedFiles.get(FAILED).add(file.getName()); + System.out.println("Files failed to process: " + processedFiles.get(FAILED)); System.out.println("Exception handled: " + e.getMessage()); } } class Watcher implements Runnable { + Map> processedFiles; + String SUCCESSFUL = "successful"; + String PENDING = "pending"; + String FAILED = "failed"; + + public Watcher(Map> processedFiles) { + this.processedFiles = processedFiles; + this.processedFiles.put(SUCCESSFUL, new HashSet<>()); + this.processedFiles.put(PENDING, new HashSet<>()); + this.processedFiles.put(FAILED, new HashSet<>()); + } @Override public void run() { @@ -41,11 +73,17 @@ public void run() { while (true) { if (inputDirectory.listFiles().length != 0) { Arrays.stream(inputDirectory.listFiles()).forEach( - file -> { - Thread t = new Thread(new FileProcessor(file)); - t.setUncaughtExceptionHandler(new ExceptionHandler()); + file -> { + boolean fileIsNotInSuccessful = !processedFiles.get(SUCCESSFUL).contains(file.getName()); + boolean fileIsNotInPending = !processedFiles.get(PENDING).contains(file.getName()); + if (fileIsNotInSuccessful && fileIsNotInPending) { + // Thread t = new Thread(new FileProcessor(file, processedFiles)); // leads to race condition as opposed to variable reference + FileProcessor proc = new FileProcessor(file, processedFiles); + Thread t = new Thread(proc); + t.setUncaughtExceptionHandler(new ExceptionHandler(processedFiles, file)); t.start(); } + } ); } @@ -55,7 +93,7 @@ public void run() { private void sleep() { try { - Thread.sleep(60000); + Thread.sleep(10000); } catch (InterruptedException e) { e.printStackTrace(); } @@ -67,8 +105,14 @@ class FileProcessor implements Runnable { private final File file; private final static String OUTPUT_PATH = "./src/main/output/"; - public FileProcessor(File file) { + Map> processedFiles; + String SUCCESSFUL = "successful"; + String PENDING = "pending"; + + public FileProcessor(File file, Map> processedFiles) { this.file = file; + this.processedFiles = processedFiles; + processedFiles.get(PENDING).add(file.getName()); } @Override @@ -88,7 +132,8 @@ public void run() { }); writer.close(); - + processedFiles.get(SUCCESSFUL).add(file.getName()); + processedFiles.get(PENDING).remove(file.getName()); } catch (IOException e) { e.printStackTrace(); } diff --git a/chapter_3/lecture_7/src/main/output/file1.txt b/chapter_3/lecture_7_project_parallel_text_file_processing/src/main/output/file1.txt similarity index 100% rename from chapter_3/lecture_7/src/main/output/file1.txt rename to chapter_3/lecture_7_project_parallel_text_file_processing/src/main/output/file1.txt diff --git a/chapter_3/lecture_7/src/main/output/file2.txt b/chapter_3/lecture_7_project_parallel_text_file_processing/src/main/output/file2.txt similarity index 100% rename from chapter_3/lecture_7/src/main/output/file2.txt rename to chapter_3/lecture_7_project_parallel_text_file_processing/src/main/output/file2.txt diff --git a/chapter_3/lecture_7/src/main/output/file3.txt b/chapter_3/lecture_7_project_parallel_text_file_processing/src/main/output/file3.txt similarity index 100% rename from chapter_3/lecture_7/src/main/output/file3.txt rename to chapter_3/lecture_7_project_parallel_text_file_processing/src/main/output/file3.txt diff --git a/chapter_3/lecture_7/src/main/resources/file1.txt b/chapter_3/lecture_7_project_parallel_text_file_processing/src/main/resources/file1.txt similarity index 100% rename from chapter_3/lecture_7/src/main/resources/file1.txt rename to chapter_3/lecture_7_project_parallel_text_file_processing/src/main/resources/file1.txt diff --git a/chapter_3/lecture_7/src/main/resources/file2.txt b/chapter_3/lecture_7_project_parallel_text_file_processing/src/main/resources/file2.txt similarity index 100% rename from chapter_3/lecture_7/src/main/resources/file2.txt rename to chapter_3/lecture_7_project_parallel_text_file_processing/src/main/resources/file2.txt diff --git a/chapter_3/lecture_7/src/main/resources/file3.txt b/chapter_3/lecture_7_project_parallel_text_file_processing/src/main/resources/file3.txt similarity index 100% rename from chapter_3/lecture_7/src/main/resources/file3.txt rename to chapter_3/lecture_7_project_parallel_text_file_processing/src/main/resources/file3.txt From 7ca0db159cdac79ed06591942149744846f5ac37 Mon Sep 17 00:00:00 2001 From: jeanfern5 Date: Wed, 1 May 2024 18:39:04 -0700 Subject: [PATCH 12/40] Completed Chapter 3 Thread Management --- .../lecture_1_thread_creation/build.gradle | 0 .../gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 .../lecture_1_thread_creation/gradlew | 0 .../lecture_1_thread_creation/gradlew.bat | 0 .../lecture_1_thread_creation/settings.gradle | 0 .../src/main/java/Main.java | 0 .../build.gradle | 0 .../gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 .../lecture_2_thread_priorities_and_state/gradlew | 0 .../gradlew.bat | 0 .../settings.gradle | 0 .../src/main/java/Main.java | 0 .../lecture_3_thread_groups/build.gradle | 0 .../gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 .../lecture_3_thread_groups/gradlew | 0 .../lecture_3_thread_groups/gradlew.bat | 0 .../lecture_3_thread_groups/settings.gradle | 0 .../lecture_3_thread_groups/src/main/java/Main.java | 0 .../lecture_4_daemon_and_user_threads/build.gradle | 0 .../gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 .../lecture_4_daemon_and_user_threads/gradlew | 0 .../lecture_4_daemon_and_user_threads/gradlew.bat | 0 .../settings.gradle | 0 .../src/main/java/Main.java | 0 .../build.gradle | 0 .../gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 .../lecture_5_thread_exception_handling/gradlew | 0 .../lecture_5_thread_exception_handling/gradlew.bat | 0 .../settings.gradle | 0 .../src/main/java/Main.java | 0 .../build.gradle | 0 .../gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 .../gradlew | 0 .../gradlew.bat | 0 .../settings.gradle | 0 .../src/main/java/Main.java | 0 .../build.gradle | 0 .../file1.txt_processing | 0 .../gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 .../gradlew | 0 .../gradlew.bat | 0 .../settings.gradle | 0 .../src/main/java/Main.java | 0 .../src/main/output/file1.txt | 0 .../src/main/output/file2.txt | 0 .../src/main/output/file3.txt | 0 .../src/main/resources/file1.txt | 0 .../src/main/resources/file2.txt | 0 .../src/main/resources/file3.txt | 0 56 files changed, 0 insertions(+), 0 deletions(-) rename {chapter_3 => chapter_3_thread_management}/lecture_1_thread_creation/build.gradle (100%) rename {chapter_3 => chapter_3_thread_management}/lecture_1_thread_creation/gradle/wrapper/gradle-wrapper.jar (100%) rename {chapter_3 => chapter_3_thread_management}/lecture_1_thread_creation/gradle/wrapper/gradle-wrapper.properties (100%) rename {chapter_3 => chapter_3_thread_management}/lecture_1_thread_creation/gradlew (100%) rename {chapter_3 => chapter_3_thread_management}/lecture_1_thread_creation/gradlew.bat (100%) rename {chapter_3 => chapter_3_thread_management}/lecture_1_thread_creation/settings.gradle (100%) rename {chapter_3 => chapter_3_thread_management}/lecture_1_thread_creation/src/main/java/Main.java (100%) rename {chapter_3 => chapter_3_thread_management}/lecture_2_thread_priorities_and_state/build.gradle (100%) rename {chapter_3 => chapter_3_thread_management}/lecture_2_thread_priorities_and_state/gradle/wrapper/gradle-wrapper.jar (100%) rename {chapter_3 => chapter_3_thread_management}/lecture_2_thread_priorities_and_state/gradle/wrapper/gradle-wrapper.properties (100%) rename {chapter_3 => chapter_3_thread_management}/lecture_2_thread_priorities_and_state/gradlew (100%) rename {chapter_3 => chapter_3_thread_management}/lecture_2_thread_priorities_and_state/gradlew.bat (100%) rename {chapter_3 => chapter_3_thread_management}/lecture_2_thread_priorities_and_state/settings.gradle (100%) rename {chapter_3 => chapter_3_thread_management}/lecture_2_thread_priorities_and_state/src/main/java/Main.java (100%) rename {chapter_3 => chapter_3_thread_management}/lecture_3_thread_groups/build.gradle (100%) rename {chapter_3 => chapter_3_thread_management}/lecture_3_thread_groups/gradle/wrapper/gradle-wrapper.jar (100%) rename {chapter_3 => chapter_3_thread_management}/lecture_3_thread_groups/gradle/wrapper/gradle-wrapper.properties (100%) rename {chapter_3 => chapter_3_thread_management}/lecture_3_thread_groups/gradlew (100%) rename {chapter_3 => chapter_3_thread_management}/lecture_3_thread_groups/gradlew.bat (100%) rename {chapter_3 => chapter_3_thread_management}/lecture_3_thread_groups/settings.gradle (100%) rename {chapter_3 => chapter_3_thread_management}/lecture_3_thread_groups/src/main/java/Main.java (100%) rename {chapter_3 => chapter_3_thread_management}/lecture_4_daemon_and_user_threads/build.gradle (100%) rename {chapter_3 => chapter_3_thread_management}/lecture_4_daemon_and_user_threads/gradle/wrapper/gradle-wrapper.jar (100%) rename {chapter_3 => chapter_3_thread_management}/lecture_4_daemon_and_user_threads/gradle/wrapper/gradle-wrapper.properties (100%) rename {chapter_3 => chapter_3_thread_management}/lecture_4_daemon_and_user_threads/gradlew (100%) rename {chapter_3 => chapter_3_thread_management}/lecture_4_daemon_and_user_threads/gradlew.bat (100%) rename {chapter_3 => chapter_3_thread_management}/lecture_4_daemon_and_user_threads/settings.gradle (100%) rename {chapter_3 => chapter_3_thread_management}/lecture_4_daemon_and_user_threads/src/main/java/Main.java (100%) rename {chapter_3 => chapter_3_thread_management}/lecture_5_thread_exception_handling/build.gradle (100%) rename {chapter_3 => chapter_3_thread_management}/lecture_5_thread_exception_handling/gradle/wrapper/gradle-wrapper.jar (100%) rename {chapter_3 => chapter_3_thread_management}/lecture_5_thread_exception_handling/gradle/wrapper/gradle-wrapper.properties (100%) rename {chapter_3 => chapter_3_thread_management}/lecture_5_thread_exception_handling/gradlew (100%) rename {chapter_3 => chapter_3_thread_management}/lecture_5_thread_exception_handling/gradlew.bat (100%) rename {chapter_3 => chapter_3_thread_management}/lecture_5_thread_exception_handling/settings.gradle (100%) rename {chapter_3 => chapter_3_thread_management}/lecture_5_thread_exception_handling/src/main/java/Main.java (100%) rename {chapter_3 => chapter_3_thread_management}/lecture_6_thread_local_variable_and_race_conditions/build.gradle (100%) rename {chapter_3 => chapter_3_thread_management}/lecture_6_thread_local_variable_and_race_conditions/gradle/wrapper/gradle-wrapper.jar (100%) rename {chapter_3 => chapter_3_thread_management}/lecture_6_thread_local_variable_and_race_conditions/gradle/wrapper/gradle-wrapper.properties (100%) rename {chapter_3 => chapter_3_thread_management}/lecture_6_thread_local_variable_and_race_conditions/gradlew (100%) rename {chapter_3 => chapter_3_thread_management}/lecture_6_thread_local_variable_and_race_conditions/gradlew.bat (100%) rename {chapter_3 => chapter_3_thread_management}/lecture_6_thread_local_variable_and_race_conditions/settings.gradle (100%) rename {chapter_3 => chapter_3_thread_management}/lecture_6_thread_local_variable_and_race_conditions/src/main/java/Main.java (100%) rename {chapter_3 => chapter_3_thread_management}/lecture_7_project_parallel_text_file_processing/build.gradle (100%) rename {chapter_3 => chapter_3_thread_management}/lecture_7_project_parallel_text_file_processing/file1.txt_processing (100%) rename {chapter_3 => chapter_3_thread_management}/lecture_7_project_parallel_text_file_processing/gradle/wrapper/gradle-wrapper.jar (100%) rename {chapter_3 => chapter_3_thread_management}/lecture_7_project_parallel_text_file_processing/gradle/wrapper/gradle-wrapper.properties (100%) rename {chapter_3 => chapter_3_thread_management}/lecture_7_project_parallel_text_file_processing/gradlew (100%) rename {chapter_3 => chapter_3_thread_management}/lecture_7_project_parallel_text_file_processing/gradlew.bat (100%) rename {chapter_3 => chapter_3_thread_management}/lecture_7_project_parallel_text_file_processing/settings.gradle (100%) rename {chapter_3 => chapter_3_thread_management}/lecture_7_project_parallel_text_file_processing/src/main/java/Main.java (100%) rename {chapter_3 => chapter_3_thread_management}/lecture_7_project_parallel_text_file_processing/src/main/output/file1.txt (100%) rename {chapter_3 => chapter_3_thread_management}/lecture_7_project_parallel_text_file_processing/src/main/output/file2.txt (100%) rename {chapter_3 => chapter_3_thread_management}/lecture_7_project_parallel_text_file_processing/src/main/output/file3.txt (100%) rename {chapter_3 => chapter_3_thread_management}/lecture_7_project_parallel_text_file_processing/src/main/resources/file1.txt (100%) rename {chapter_3 => chapter_3_thread_management}/lecture_7_project_parallel_text_file_processing/src/main/resources/file2.txt (100%) rename {chapter_3 => chapter_3_thread_management}/lecture_7_project_parallel_text_file_processing/src/main/resources/file3.txt (100%) diff --git a/chapter_3/lecture_1_thread_creation/build.gradle b/chapter_3_thread_management/lecture_1_thread_creation/build.gradle similarity index 100% rename from chapter_3/lecture_1_thread_creation/build.gradle rename to chapter_3_thread_management/lecture_1_thread_creation/build.gradle diff --git a/chapter_3/lecture_1_thread_creation/gradle/wrapper/gradle-wrapper.jar b/chapter_3_thread_management/lecture_1_thread_creation/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from chapter_3/lecture_1_thread_creation/gradle/wrapper/gradle-wrapper.jar rename to chapter_3_thread_management/lecture_1_thread_creation/gradle/wrapper/gradle-wrapper.jar diff --git a/chapter_3/lecture_1_thread_creation/gradle/wrapper/gradle-wrapper.properties b/chapter_3_thread_management/lecture_1_thread_creation/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from chapter_3/lecture_1_thread_creation/gradle/wrapper/gradle-wrapper.properties rename to chapter_3_thread_management/lecture_1_thread_creation/gradle/wrapper/gradle-wrapper.properties diff --git a/chapter_3/lecture_1_thread_creation/gradlew b/chapter_3_thread_management/lecture_1_thread_creation/gradlew similarity index 100% rename from chapter_3/lecture_1_thread_creation/gradlew rename to chapter_3_thread_management/lecture_1_thread_creation/gradlew diff --git a/chapter_3/lecture_1_thread_creation/gradlew.bat b/chapter_3_thread_management/lecture_1_thread_creation/gradlew.bat similarity index 100% rename from chapter_3/lecture_1_thread_creation/gradlew.bat rename to chapter_3_thread_management/lecture_1_thread_creation/gradlew.bat diff --git a/chapter_3/lecture_1_thread_creation/settings.gradle b/chapter_3_thread_management/lecture_1_thread_creation/settings.gradle similarity index 100% rename from chapter_3/lecture_1_thread_creation/settings.gradle rename to chapter_3_thread_management/lecture_1_thread_creation/settings.gradle diff --git a/chapter_3/lecture_1_thread_creation/src/main/java/Main.java b/chapter_3_thread_management/lecture_1_thread_creation/src/main/java/Main.java similarity index 100% rename from chapter_3/lecture_1_thread_creation/src/main/java/Main.java rename to chapter_3_thread_management/lecture_1_thread_creation/src/main/java/Main.java diff --git a/chapter_3/lecture_2_thread_priorities_and_state/build.gradle b/chapter_3_thread_management/lecture_2_thread_priorities_and_state/build.gradle similarity index 100% rename from chapter_3/lecture_2_thread_priorities_and_state/build.gradle rename to chapter_3_thread_management/lecture_2_thread_priorities_and_state/build.gradle diff --git a/chapter_3/lecture_2_thread_priorities_and_state/gradle/wrapper/gradle-wrapper.jar b/chapter_3_thread_management/lecture_2_thread_priorities_and_state/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from chapter_3/lecture_2_thread_priorities_and_state/gradle/wrapper/gradle-wrapper.jar rename to chapter_3_thread_management/lecture_2_thread_priorities_and_state/gradle/wrapper/gradle-wrapper.jar diff --git a/chapter_3/lecture_2_thread_priorities_and_state/gradle/wrapper/gradle-wrapper.properties b/chapter_3_thread_management/lecture_2_thread_priorities_and_state/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from chapter_3/lecture_2_thread_priorities_and_state/gradle/wrapper/gradle-wrapper.properties rename to chapter_3_thread_management/lecture_2_thread_priorities_and_state/gradle/wrapper/gradle-wrapper.properties diff --git a/chapter_3/lecture_2_thread_priorities_and_state/gradlew b/chapter_3_thread_management/lecture_2_thread_priorities_and_state/gradlew similarity index 100% rename from chapter_3/lecture_2_thread_priorities_and_state/gradlew rename to chapter_3_thread_management/lecture_2_thread_priorities_and_state/gradlew diff --git a/chapter_3/lecture_2_thread_priorities_and_state/gradlew.bat b/chapter_3_thread_management/lecture_2_thread_priorities_and_state/gradlew.bat similarity index 100% rename from chapter_3/lecture_2_thread_priorities_and_state/gradlew.bat rename to chapter_3_thread_management/lecture_2_thread_priorities_and_state/gradlew.bat diff --git a/chapter_3/lecture_2_thread_priorities_and_state/settings.gradle b/chapter_3_thread_management/lecture_2_thread_priorities_and_state/settings.gradle similarity index 100% rename from chapter_3/lecture_2_thread_priorities_and_state/settings.gradle rename to chapter_3_thread_management/lecture_2_thread_priorities_and_state/settings.gradle diff --git a/chapter_3/lecture_2_thread_priorities_and_state/src/main/java/Main.java b/chapter_3_thread_management/lecture_2_thread_priorities_and_state/src/main/java/Main.java similarity index 100% rename from chapter_3/lecture_2_thread_priorities_and_state/src/main/java/Main.java rename to chapter_3_thread_management/lecture_2_thread_priorities_and_state/src/main/java/Main.java diff --git a/chapter_3/lecture_3_thread_groups/build.gradle b/chapter_3_thread_management/lecture_3_thread_groups/build.gradle similarity index 100% rename from chapter_3/lecture_3_thread_groups/build.gradle rename to chapter_3_thread_management/lecture_3_thread_groups/build.gradle diff --git a/chapter_3/lecture_3_thread_groups/gradle/wrapper/gradle-wrapper.jar b/chapter_3_thread_management/lecture_3_thread_groups/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from chapter_3/lecture_3_thread_groups/gradle/wrapper/gradle-wrapper.jar rename to chapter_3_thread_management/lecture_3_thread_groups/gradle/wrapper/gradle-wrapper.jar diff --git a/chapter_3/lecture_3_thread_groups/gradle/wrapper/gradle-wrapper.properties b/chapter_3_thread_management/lecture_3_thread_groups/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from chapter_3/lecture_3_thread_groups/gradle/wrapper/gradle-wrapper.properties rename to chapter_3_thread_management/lecture_3_thread_groups/gradle/wrapper/gradle-wrapper.properties diff --git a/chapter_3/lecture_3_thread_groups/gradlew b/chapter_3_thread_management/lecture_3_thread_groups/gradlew similarity index 100% rename from chapter_3/lecture_3_thread_groups/gradlew rename to chapter_3_thread_management/lecture_3_thread_groups/gradlew diff --git a/chapter_3/lecture_3_thread_groups/gradlew.bat b/chapter_3_thread_management/lecture_3_thread_groups/gradlew.bat similarity index 100% rename from chapter_3/lecture_3_thread_groups/gradlew.bat rename to chapter_3_thread_management/lecture_3_thread_groups/gradlew.bat diff --git a/chapter_3/lecture_3_thread_groups/settings.gradle b/chapter_3_thread_management/lecture_3_thread_groups/settings.gradle similarity index 100% rename from chapter_3/lecture_3_thread_groups/settings.gradle rename to chapter_3_thread_management/lecture_3_thread_groups/settings.gradle diff --git a/chapter_3/lecture_3_thread_groups/src/main/java/Main.java b/chapter_3_thread_management/lecture_3_thread_groups/src/main/java/Main.java similarity index 100% rename from chapter_3/lecture_3_thread_groups/src/main/java/Main.java rename to chapter_3_thread_management/lecture_3_thread_groups/src/main/java/Main.java diff --git a/chapter_3/lecture_4_daemon_and_user_threads/build.gradle b/chapter_3_thread_management/lecture_4_daemon_and_user_threads/build.gradle similarity index 100% rename from chapter_3/lecture_4_daemon_and_user_threads/build.gradle rename to chapter_3_thread_management/lecture_4_daemon_and_user_threads/build.gradle diff --git a/chapter_3/lecture_4_daemon_and_user_threads/gradle/wrapper/gradle-wrapper.jar b/chapter_3_thread_management/lecture_4_daemon_and_user_threads/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from chapter_3/lecture_4_daemon_and_user_threads/gradle/wrapper/gradle-wrapper.jar rename to chapter_3_thread_management/lecture_4_daemon_and_user_threads/gradle/wrapper/gradle-wrapper.jar diff --git a/chapter_3/lecture_4_daemon_and_user_threads/gradle/wrapper/gradle-wrapper.properties b/chapter_3_thread_management/lecture_4_daemon_and_user_threads/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from chapter_3/lecture_4_daemon_and_user_threads/gradle/wrapper/gradle-wrapper.properties rename to chapter_3_thread_management/lecture_4_daemon_and_user_threads/gradle/wrapper/gradle-wrapper.properties diff --git a/chapter_3/lecture_4_daemon_and_user_threads/gradlew b/chapter_3_thread_management/lecture_4_daemon_and_user_threads/gradlew similarity index 100% rename from chapter_3/lecture_4_daemon_and_user_threads/gradlew rename to chapter_3_thread_management/lecture_4_daemon_and_user_threads/gradlew diff --git a/chapter_3/lecture_4_daemon_and_user_threads/gradlew.bat b/chapter_3_thread_management/lecture_4_daemon_and_user_threads/gradlew.bat similarity index 100% rename from chapter_3/lecture_4_daemon_and_user_threads/gradlew.bat rename to chapter_3_thread_management/lecture_4_daemon_and_user_threads/gradlew.bat diff --git a/chapter_3/lecture_4_daemon_and_user_threads/settings.gradle b/chapter_3_thread_management/lecture_4_daemon_and_user_threads/settings.gradle similarity index 100% rename from chapter_3/lecture_4_daemon_and_user_threads/settings.gradle rename to chapter_3_thread_management/lecture_4_daemon_and_user_threads/settings.gradle diff --git a/chapter_3/lecture_4_daemon_and_user_threads/src/main/java/Main.java b/chapter_3_thread_management/lecture_4_daemon_and_user_threads/src/main/java/Main.java similarity index 100% rename from chapter_3/lecture_4_daemon_and_user_threads/src/main/java/Main.java rename to chapter_3_thread_management/lecture_4_daemon_and_user_threads/src/main/java/Main.java diff --git a/chapter_3/lecture_5_thread_exception_handling/build.gradle b/chapter_3_thread_management/lecture_5_thread_exception_handling/build.gradle similarity index 100% rename from chapter_3/lecture_5_thread_exception_handling/build.gradle rename to chapter_3_thread_management/lecture_5_thread_exception_handling/build.gradle diff --git a/chapter_3/lecture_5_thread_exception_handling/gradle/wrapper/gradle-wrapper.jar b/chapter_3_thread_management/lecture_5_thread_exception_handling/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from chapter_3/lecture_5_thread_exception_handling/gradle/wrapper/gradle-wrapper.jar rename to chapter_3_thread_management/lecture_5_thread_exception_handling/gradle/wrapper/gradle-wrapper.jar diff --git a/chapter_3/lecture_5_thread_exception_handling/gradle/wrapper/gradle-wrapper.properties b/chapter_3_thread_management/lecture_5_thread_exception_handling/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from chapter_3/lecture_5_thread_exception_handling/gradle/wrapper/gradle-wrapper.properties rename to chapter_3_thread_management/lecture_5_thread_exception_handling/gradle/wrapper/gradle-wrapper.properties diff --git a/chapter_3/lecture_5_thread_exception_handling/gradlew b/chapter_3_thread_management/lecture_5_thread_exception_handling/gradlew similarity index 100% rename from chapter_3/lecture_5_thread_exception_handling/gradlew rename to chapter_3_thread_management/lecture_5_thread_exception_handling/gradlew diff --git a/chapter_3/lecture_5_thread_exception_handling/gradlew.bat b/chapter_3_thread_management/lecture_5_thread_exception_handling/gradlew.bat similarity index 100% rename from chapter_3/lecture_5_thread_exception_handling/gradlew.bat rename to chapter_3_thread_management/lecture_5_thread_exception_handling/gradlew.bat diff --git a/chapter_3/lecture_5_thread_exception_handling/settings.gradle b/chapter_3_thread_management/lecture_5_thread_exception_handling/settings.gradle similarity index 100% rename from chapter_3/lecture_5_thread_exception_handling/settings.gradle rename to chapter_3_thread_management/lecture_5_thread_exception_handling/settings.gradle diff --git a/chapter_3/lecture_5_thread_exception_handling/src/main/java/Main.java b/chapter_3_thread_management/lecture_5_thread_exception_handling/src/main/java/Main.java similarity index 100% rename from chapter_3/lecture_5_thread_exception_handling/src/main/java/Main.java rename to chapter_3_thread_management/lecture_5_thread_exception_handling/src/main/java/Main.java diff --git a/chapter_3/lecture_6_thread_local_variable_and_race_conditions/build.gradle b/chapter_3_thread_management/lecture_6_thread_local_variable_and_race_conditions/build.gradle similarity index 100% rename from chapter_3/lecture_6_thread_local_variable_and_race_conditions/build.gradle rename to chapter_3_thread_management/lecture_6_thread_local_variable_and_race_conditions/build.gradle diff --git a/chapter_3/lecture_6_thread_local_variable_and_race_conditions/gradle/wrapper/gradle-wrapper.jar b/chapter_3_thread_management/lecture_6_thread_local_variable_and_race_conditions/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from chapter_3/lecture_6_thread_local_variable_and_race_conditions/gradle/wrapper/gradle-wrapper.jar rename to chapter_3_thread_management/lecture_6_thread_local_variable_and_race_conditions/gradle/wrapper/gradle-wrapper.jar diff --git a/chapter_3/lecture_6_thread_local_variable_and_race_conditions/gradle/wrapper/gradle-wrapper.properties b/chapter_3_thread_management/lecture_6_thread_local_variable_and_race_conditions/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from chapter_3/lecture_6_thread_local_variable_and_race_conditions/gradle/wrapper/gradle-wrapper.properties rename to chapter_3_thread_management/lecture_6_thread_local_variable_and_race_conditions/gradle/wrapper/gradle-wrapper.properties diff --git a/chapter_3/lecture_6_thread_local_variable_and_race_conditions/gradlew b/chapter_3_thread_management/lecture_6_thread_local_variable_and_race_conditions/gradlew similarity index 100% rename from chapter_3/lecture_6_thread_local_variable_and_race_conditions/gradlew rename to chapter_3_thread_management/lecture_6_thread_local_variable_and_race_conditions/gradlew diff --git a/chapter_3/lecture_6_thread_local_variable_and_race_conditions/gradlew.bat b/chapter_3_thread_management/lecture_6_thread_local_variable_and_race_conditions/gradlew.bat similarity index 100% rename from chapter_3/lecture_6_thread_local_variable_and_race_conditions/gradlew.bat rename to chapter_3_thread_management/lecture_6_thread_local_variable_and_race_conditions/gradlew.bat diff --git a/chapter_3/lecture_6_thread_local_variable_and_race_conditions/settings.gradle b/chapter_3_thread_management/lecture_6_thread_local_variable_and_race_conditions/settings.gradle similarity index 100% rename from chapter_3/lecture_6_thread_local_variable_and_race_conditions/settings.gradle rename to chapter_3_thread_management/lecture_6_thread_local_variable_and_race_conditions/settings.gradle diff --git a/chapter_3/lecture_6_thread_local_variable_and_race_conditions/src/main/java/Main.java b/chapter_3_thread_management/lecture_6_thread_local_variable_and_race_conditions/src/main/java/Main.java similarity index 100% rename from chapter_3/lecture_6_thread_local_variable_and_race_conditions/src/main/java/Main.java rename to chapter_3_thread_management/lecture_6_thread_local_variable_and_race_conditions/src/main/java/Main.java diff --git a/chapter_3/lecture_7_project_parallel_text_file_processing/build.gradle b/chapter_3_thread_management/lecture_7_project_parallel_text_file_processing/build.gradle similarity index 100% rename from chapter_3/lecture_7_project_parallel_text_file_processing/build.gradle rename to chapter_3_thread_management/lecture_7_project_parallel_text_file_processing/build.gradle diff --git a/chapter_3/lecture_7_project_parallel_text_file_processing/file1.txt_processing b/chapter_3_thread_management/lecture_7_project_parallel_text_file_processing/file1.txt_processing similarity index 100% rename from chapter_3/lecture_7_project_parallel_text_file_processing/file1.txt_processing rename to chapter_3_thread_management/lecture_7_project_parallel_text_file_processing/file1.txt_processing diff --git a/chapter_3/lecture_7_project_parallel_text_file_processing/gradle/wrapper/gradle-wrapper.jar b/chapter_3_thread_management/lecture_7_project_parallel_text_file_processing/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from chapter_3/lecture_7_project_parallel_text_file_processing/gradle/wrapper/gradle-wrapper.jar rename to chapter_3_thread_management/lecture_7_project_parallel_text_file_processing/gradle/wrapper/gradle-wrapper.jar diff --git a/chapter_3/lecture_7_project_parallel_text_file_processing/gradle/wrapper/gradle-wrapper.properties b/chapter_3_thread_management/lecture_7_project_parallel_text_file_processing/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from chapter_3/lecture_7_project_parallel_text_file_processing/gradle/wrapper/gradle-wrapper.properties rename to chapter_3_thread_management/lecture_7_project_parallel_text_file_processing/gradle/wrapper/gradle-wrapper.properties diff --git a/chapter_3/lecture_7_project_parallel_text_file_processing/gradlew b/chapter_3_thread_management/lecture_7_project_parallel_text_file_processing/gradlew similarity index 100% rename from chapter_3/lecture_7_project_parallel_text_file_processing/gradlew rename to chapter_3_thread_management/lecture_7_project_parallel_text_file_processing/gradlew diff --git a/chapter_3/lecture_7_project_parallel_text_file_processing/gradlew.bat b/chapter_3_thread_management/lecture_7_project_parallel_text_file_processing/gradlew.bat similarity index 100% rename from chapter_3/lecture_7_project_parallel_text_file_processing/gradlew.bat rename to chapter_3_thread_management/lecture_7_project_parallel_text_file_processing/gradlew.bat diff --git a/chapter_3/lecture_7_project_parallel_text_file_processing/settings.gradle b/chapter_3_thread_management/lecture_7_project_parallel_text_file_processing/settings.gradle similarity index 100% rename from chapter_3/lecture_7_project_parallel_text_file_processing/settings.gradle rename to chapter_3_thread_management/lecture_7_project_parallel_text_file_processing/settings.gradle diff --git a/chapter_3/lecture_7_project_parallel_text_file_processing/src/main/java/Main.java b/chapter_3_thread_management/lecture_7_project_parallel_text_file_processing/src/main/java/Main.java similarity index 100% rename from chapter_3/lecture_7_project_parallel_text_file_processing/src/main/java/Main.java rename to chapter_3_thread_management/lecture_7_project_parallel_text_file_processing/src/main/java/Main.java diff --git a/chapter_3/lecture_7_project_parallel_text_file_processing/src/main/output/file1.txt b/chapter_3_thread_management/lecture_7_project_parallel_text_file_processing/src/main/output/file1.txt similarity index 100% rename from chapter_3/lecture_7_project_parallel_text_file_processing/src/main/output/file1.txt rename to chapter_3_thread_management/lecture_7_project_parallel_text_file_processing/src/main/output/file1.txt diff --git a/chapter_3/lecture_7_project_parallel_text_file_processing/src/main/output/file2.txt b/chapter_3_thread_management/lecture_7_project_parallel_text_file_processing/src/main/output/file2.txt similarity index 100% rename from chapter_3/lecture_7_project_parallel_text_file_processing/src/main/output/file2.txt rename to chapter_3_thread_management/lecture_7_project_parallel_text_file_processing/src/main/output/file2.txt diff --git a/chapter_3/lecture_7_project_parallel_text_file_processing/src/main/output/file3.txt b/chapter_3_thread_management/lecture_7_project_parallel_text_file_processing/src/main/output/file3.txt similarity index 100% rename from chapter_3/lecture_7_project_parallel_text_file_processing/src/main/output/file3.txt rename to chapter_3_thread_management/lecture_7_project_parallel_text_file_processing/src/main/output/file3.txt diff --git a/chapter_3/lecture_7_project_parallel_text_file_processing/src/main/resources/file1.txt b/chapter_3_thread_management/lecture_7_project_parallel_text_file_processing/src/main/resources/file1.txt similarity index 100% rename from chapter_3/lecture_7_project_parallel_text_file_processing/src/main/resources/file1.txt rename to chapter_3_thread_management/lecture_7_project_parallel_text_file_processing/src/main/resources/file1.txt diff --git a/chapter_3/lecture_7_project_parallel_text_file_processing/src/main/resources/file2.txt b/chapter_3_thread_management/lecture_7_project_parallel_text_file_processing/src/main/resources/file2.txt similarity index 100% rename from chapter_3/lecture_7_project_parallel_text_file_processing/src/main/resources/file2.txt rename to chapter_3_thread_management/lecture_7_project_parallel_text_file_processing/src/main/resources/file2.txt diff --git a/chapter_3/lecture_7_project_parallel_text_file_processing/src/main/resources/file3.txt b/chapter_3_thread_management/lecture_7_project_parallel_text_file_processing/src/main/resources/file3.txt similarity index 100% rename from chapter_3/lecture_7_project_parallel_text_file_processing/src/main/resources/file3.txt rename to chapter_3_thread_management/lecture_7_project_parallel_text_file_processing/src/main/resources/file3.txt From 44ae100ff8d7a33a538f3a5e54c16fc400c87ad4 Mon Sep 17 00:00:00 2001 From: jeanfern5 Date: Thu, 2 May 2024 19:27:03 -0700 Subject: [PATCH 13/40] Completed Chapter 4 Lecture 2: Synchronized Keyword --- chapter_4/lecture_2/src/main/java/Main.java | 63 ------------ .../build.gradle | 0 .../gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 .../gradlew | 0 .../gradlew.bat | 0 .../settings.gradle | 0 .../src/main/java/Main.java | 93 ++++++++++++++++++ 8 files changed, 93 insertions(+), 63 deletions(-) delete mode 100644 chapter_4/lecture_2/src/main/java/Main.java rename chapter_4/{lecture_2 => lecture_2_synchronized_keyword}/build.gradle (100%) rename chapter_4/{lecture_2 => lecture_2_synchronized_keyword}/gradle/wrapper/gradle-wrapper.jar (100%) rename chapter_4/{lecture_2 => lecture_2_synchronized_keyword}/gradle/wrapper/gradle-wrapper.properties (100%) rename chapter_4/{lecture_2 => lecture_2_synchronized_keyword}/gradlew (100%) rename chapter_4/{lecture_2 => lecture_2_synchronized_keyword}/gradlew.bat (100%) rename chapter_4/{lecture_2 => lecture_2_synchronized_keyword}/settings.gradle (100%) create mode 100644 chapter_4/lecture_2_synchronized_keyword/src/main/java/Main.java diff --git a/chapter_4/lecture_2/src/main/java/Main.java b/chapter_4/lecture_2/src/main/java/Main.java deleted file mode 100644 index d6ff69b..0000000 --- a/chapter_4/lecture_2/src/main/java/Main.java +++ /dev/null @@ -1,63 +0,0 @@ -import java.util.ArrayList; -import java.util.List; - -public class Main { - - private static int globalCounter = 0; - private static final Object obj = new Object(); - - public static void main(String[] args) { - List threads = new ArrayList<>(); - - ThreadGroup group = new ThreadGroup("Group1"); - - for (int i = 1; i<=1000; i++) { - Thread t = new Thread(group, new MyThread()); - t.start(); - threads.add(t); - } - - group.interrupt(); - - threads.forEach(t -> { - try { - t.join(); - } catch (InterruptedException e) { - e.printStackTrace(); - } - }); - - System.out.println("Total = " + globalCounter); - } - - static class MyThread implements Runnable { - @Override - public void run() { - try { - Thread.sleep(99999); - } catch (InterruptedException e) { - - } - synchronized (obj) { - globalCounter++; - } - - -// int localCounter = globalCounter; -// localCounter = localCounter + 1; -// globalCounter = localCounter; - } - - private static void staticIncrement() { - synchronized (MyThread.class) { - - } - } - - private void increment() { - synchronized (this) { - - } - } - } -} diff --git a/chapter_4/lecture_2/build.gradle b/chapter_4/lecture_2_synchronized_keyword/build.gradle similarity index 100% rename from chapter_4/lecture_2/build.gradle rename to chapter_4/lecture_2_synchronized_keyword/build.gradle diff --git a/chapter_4/lecture_2/gradle/wrapper/gradle-wrapper.jar b/chapter_4/lecture_2_synchronized_keyword/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from chapter_4/lecture_2/gradle/wrapper/gradle-wrapper.jar rename to chapter_4/lecture_2_synchronized_keyword/gradle/wrapper/gradle-wrapper.jar diff --git a/chapter_4/lecture_2/gradle/wrapper/gradle-wrapper.properties b/chapter_4/lecture_2_synchronized_keyword/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from chapter_4/lecture_2/gradle/wrapper/gradle-wrapper.properties rename to chapter_4/lecture_2_synchronized_keyword/gradle/wrapper/gradle-wrapper.properties diff --git a/chapter_4/lecture_2/gradlew b/chapter_4/lecture_2_synchronized_keyword/gradlew similarity index 100% rename from chapter_4/lecture_2/gradlew rename to chapter_4/lecture_2_synchronized_keyword/gradlew diff --git a/chapter_4/lecture_2/gradlew.bat b/chapter_4/lecture_2_synchronized_keyword/gradlew.bat similarity index 100% rename from chapter_4/lecture_2/gradlew.bat rename to chapter_4/lecture_2_synchronized_keyword/gradlew.bat diff --git a/chapter_4/lecture_2/settings.gradle b/chapter_4/lecture_2_synchronized_keyword/settings.gradle similarity index 100% rename from chapter_4/lecture_2/settings.gradle rename to chapter_4/lecture_2_synchronized_keyword/settings.gradle diff --git a/chapter_4/lecture_2_synchronized_keyword/src/main/java/Main.java b/chapter_4/lecture_2_synchronized_keyword/src/main/java/Main.java new file mode 100644 index 0000000..50a2cc5 --- /dev/null +++ b/chapter_4/lecture_2_synchronized_keyword/src/main/java/Main.java @@ -0,0 +1,93 @@ +// Code taken from Chapter 3 Lecture 6: Thread Local Variables and Race Conditions +// Added synchronized block and synchronized method + + +import java.util.ArrayList; +import java.util.List; + +public class Main { + private static int globalCounter = 0; + private static final Object obj = new Object(); + + public static void main(String[] args) { + List threads = new ArrayList<>(); + + ThreadGroup group = new ThreadGroup("Group1"); + + for (int i = 1; i<=1000; i++) { + Thread t = new Thread(group, new MyThread()); + t.start(); + threads.add(t); + } + + group.interrupt(); + + threads.forEach(t -> { + try { + t.join(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + }); + + System.out.println("Total = " + globalCounter); + } + + static class MyThread implements Runnable { + @Override + public void run() { + try { + Thread.sleep(99999); + } catch (InterruptedException ignored) { + + } + + // synchronized block - more granular control + synchronized (obj) { // object should be accessible to all the thread + globalCounter++; + } + +// // Race Condition issue!! +// // problem with this is that if multiple threads share a global variable and read variable value the same +// // example: running 3 threads, where thread 1 and 3 both read the globalCounter=1, +// // then both threads increment globalCounter to 2 instead of 3 (1 -> thread1++1 -> thread3++1 -> 3) +// // race condition behaviour: (1 -> thread1++1 -> [2] +// // 1 -> thread3++1 -> [2]) +// // expected behaviour: (1 -> thread1++1 -> 2 -> thread3++1 -> [3]) +// int localCounter = globalCounter; +// localCounter = localCounter + 1; +// globalCounter = localCounter; + + } + +// // synchronized method (equivalent to synchronized block) +// private synchronized void increment() { +// +// } + } + +// private static ThreadLocal threadLocal = new ThreadLocal<>(); +// private static ThreadLocal threadLocal = ThreadLocal.withInitial(() -> "initialValue"); + +// public static void main(String[] args) { +// Thread t1 = new Thread(new MyThread()); +// Thread t2 = new Thread(new MyThread()); +// +// t1.start(); +// t2.start(); +// +// } +// +// static class MyThread implements Runnable { +// @Override +// public void run() { +// int counter = 0; +// +// threadLocal.set("myValue"); +// threadLocal.get(); +// +// System.out.println("ThreadLocal: " + threadLocal.get()); +// } +// } + +} \ No newline at end of file From b1c90a9e5a795e1f52b8dafa3e6b8d26ad43193a Mon Sep 17 00:00:00 2001 From: jeanfern5 Date: Thu, 2 May 2024 20:05:01 -0700 Subject: [PATCH 14/40] Completed --- .../build.gradle | 0 .../gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 .../gradlew | 0 .../gradlew.bat | 0 .../settings.gradle | 0 .../src/main/java/Main.java | 27 +++++++++--------- 7 files changed, 14 insertions(+), 13 deletions(-) rename chapter_4/{lecture_3 => lecture_3_wait_sets_and_notifications}/build.gradle (100%) rename chapter_4/{lecture_3 => lecture_3_wait_sets_and_notifications}/gradle/wrapper/gradle-wrapper.jar (100%) rename chapter_4/{lecture_3 => lecture_3_wait_sets_and_notifications}/gradle/wrapper/gradle-wrapper.properties (100%) rename chapter_4/{lecture_3 => lecture_3_wait_sets_and_notifications}/gradlew (100%) rename chapter_4/{lecture_3 => lecture_3_wait_sets_and_notifications}/gradlew.bat (100%) rename chapter_4/{lecture_3 => lecture_3_wait_sets_and_notifications}/settings.gradle (100%) rename chapter_4/{lecture_3 => lecture_3_wait_sets_and_notifications}/src/main/java/Main.java (75%) diff --git a/chapter_4/lecture_3/build.gradle b/chapter_4/lecture_3_wait_sets_and_notifications/build.gradle similarity index 100% rename from chapter_4/lecture_3/build.gradle rename to chapter_4/lecture_3_wait_sets_and_notifications/build.gradle diff --git a/chapter_4/lecture_3/gradle/wrapper/gradle-wrapper.jar b/chapter_4/lecture_3_wait_sets_and_notifications/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from chapter_4/lecture_3/gradle/wrapper/gradle-wrapper.jar rename to chapter_4/lecture_3_wait_sets_and_notifications/gradle/wrapper/gradle-wrapper.jar diff --git a/chapter_4/lecture_3/gradle/wrapper/gradle-wrapper.properties b/chapter_4/lecture_3_wait_sets_and_notifications/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from chapter_4/lecture_3/gradle/wrapper/gradle-wrapper.properties rename to chapter_4/lecture_3_wait_sets_and_notifications/gradle/wrapper/gradle-wrapper.properties diff --git a/chapter_4/lecture_3/gradlew b/chapter_4/lecture_3_wait_sets_and_notifications/gradlew similarity index 100% rename from chapter_4/lecture_3/gradlew rename to chapter_4/lecture_3_wait_sets_and_notifications/gradlew diff --git a/chapter_4/lecture_3/gradlew.bat b/chapter_4/lecture_3_wait_sets_and_notifications/gradlew.bat similarity index 100% rename from chapter_4/lecture_3/gradlew.bat rename to chapter_4/lecture_3_wait_sets_and_notifications/gradlew.bat diff --git a/chapter_4/lecture_3/settings.gradle b/chapter_4/lecture_3_wait_sets_and_notifications/settings.gradle similarity index 100% rename from chapter_4/lecture_3/settings.gradle rename to chapter_4/lecture_3_wait_sets_and_notifications/settings.gradle diff --git a/chapter_4/lecture_3/src/main/java/Main.java b/chapter_4/lecture_3_wait_sets_and_notifications/src/main/java/Main.java similarity index 75% rename from chapter_4/lecture_3/src/main/java/Main.java rename to chapter_4/lecture_3_wait_sets_and_notifications/src/main/java/Main.java index 2258a3d..de27c92 100644 --- a/chapter_4/lecture_3/src/main/java/Main.java +++ b/chapter_4/lecture_3_wait_sets_and_notifications/src/main/java/Main.java @@ -39,28 +39,29 @@ public Producer(Queue queue) { @Override public void run() { - while(true) { + while (true) { try { - produceData(); + producerData(); } catch (InterruptedException e) { - e.printStackTrace(); + throw new RuntimeException(e); } } } - private void produceData() throws InterruptedException { + private void producerData() throws InterruptedException { synchronized (queue) { if (queue.size() == 10) { - System.out.println("In producer, waiting..."); + System.out.println("In producer, waiting ..."); queue.wait(); } - Thread.sleep(1000); + Thread.sleep(500); System.out.println("Producing data with id " + queue.size()); queue.add("element_" + queue.size()); if (queue.size() == 1) { + // will unlock consumer from the waiting state queue.notify(); } } @@ -68,7 +69,6 @@ private void produceData() throws InterruptedException { } static class Consumer implements Runnable { - private final Queue queue; public Consumer(Queue queue) { @@ -79,26 +79,27 @@ public Consumer(Queue queue) { public void run() { while (true) { try { - consumeData(); + consumerData(); } catch (InterruptedException e) { - e.printStackTrace(); + throw new RuntimeException(e); } } } - private void consumeData() throws InterruptedException { + private void consumerData() throws InterruptedException { synchronized (queue) { if (queue.isEmpty()) { - System.out.println("Consumer is waiting..."); + System.out.println("Consumer is waiting ..."); queue.wait(); } - Thread.sleep(700); + Thread.sleep(250); String data = queue.remove(); - System.out.println("Consumed data: " + data); + System.out.println("Consumer data " + data); if (queue.size() == 9) { + // will unlock producer from the waiting state queue.notify(); } } From 1b6594671aa5b5d7ce0b63f6ad044d7e8ee7780b Mon Sep 17 00:00:00 2001 From: jeanfern5 Date: Fri, 3 May 2024 14:16:20 -0700 Subject: [PATCH 15/40] Completed --- .../src/main/java/Main.java | 83 +----------------- chapter_4/lecture_4/src/main/java/Main.java | 52 ----------- .../build.gradle | 0 .../gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 .../gradlew | 0 .../gradlew.bat | 0 .../settings.gradle | 0 .../src/main/java/Main.java | 81 +++++++++++++++++ 9 files changed, 82 insertions(+), 134 deletions(-) delete mode 100644 chapter_4/lecture_4/src/main/java/Main.java rename chapter_4/{lecture_4 => lecture_4_locks_with_parallel_vector_sum}/build.gradle (100%) rename chapter_4/{lecture_4 => lecture_4_locks_with_parallel_vector_sum}/gradle/wrapper/gradle-wrapper.jar (100%) rename chapter_4/{lecture_4 => lecture_4_locks_with_parallel_vector_sum}/gradle/wrapper/gradle-wrapper.properties (100%) rename chapter_4/{lecture_4 => lecture_4_locks_with_parallel_vector_sum}/gradlew (100%) rename chapter_4/{lecture_4 => lecture_4_locks_with_parallel_vector_sum}/gradlew.bat (100%) rename chapter_4/{lecture_4 => lecture_4_locks_with_parallel_vector_sum}/settings.gradle (100%) create mode 100644 chapter_4/lecture_4_locks_with_parallel_vector_sum/src/main/java/Main.java diff --git a/chapter_3_thread_management/lecture_6_thread_local_variable_and_race_conditions/src/main/java/Main.java b/chapter_3_thread_management/lecture_6_thread_local_variable_and_race_conditions/src/main/java/Main.java index 6f77d80..a8cfdd9 100644 --- a/chapter_3_thread_management/lecture_6_thread_local_variable_and_race_conditions/src/main/java/Main.java +++ b/chapter_3_thread_management/lecture_6_thread_local_variable_and_race_conditions/src/main/java/Main.java @@ -1,82 +1 @@ -// Chapter 3 Lecture 6: Thread Local Variables and Race Conditions - -import java.util.ArrayList; -import java.util.List; - -public class Main { - private static int globalCounter = 0; - - public static void main(String[] args) { - List threads = new ArrayList<>(); - - ThreadGroup group = new ThreadGroup("Group1"); - - for (int i = 1; i<=1000; i++) { - Thread t = new Thread(new MyThread()); - t.start(); - threads.add(t); - } - - group.interrupt(); - - threads.forEach(t -> { - try { - t.join(); - } catch (InterruptedException e) { - e.printStackTrace(); - } - }); - - System.out.println("Total = " + globalCounter); - } - - static class MyThread implements Runnable { - @Override - public void run() { - try { - Thread.sleep(9999); - } catch (InterruptedException ignored) { - - } - - globalCounter++; - -// // Race Condition issue!! -// // problem with this is that if multiple threads share a global variable and read variable value the same -// // example: running 3 threads, where thread 1 and 3 both read the globalCounter=1, -// // then both threads increment globalCounter to 2 instead of 3 (1 -> thread1++1 -> thread3++1 -> 3) -// // race condition behaviour: (1 -> thread1++1 -> [2] -// // 1 -> thread3++1 -> [2]) -// // expected behaviour: (1 -> thread1++1 -> 2 -> thread3++1 -> [3]) -// int localCounter = globalCounter; -// localCounter = localCounter + 1; -// globalCounter = localCounter; - - } - } - -// private static ThreadLocal threadLocal = new ThreadLocal<>(); -// private static ThreadLocal threadLocal = ThreadLocal.withInitial(() -> "initialValue"); - -// public static void main(String[] args) { -// Thread t1 = new Thread(new MyThread()); -// Thread t2 = new Thread(new MyThread()); -// -// t1.start(); -// t2.start(); -// -// } -// -// static class MyThread implements Runnable { -// @Override -// public void run() { -// int counter = 0; -// -// threadLocal.set("myValue"); -// threadLocal.get(); -// -// System.out.println("ThreadLocal: " + threadLocal.get()); -// } -// } - -} \ No newline at end of file +ide \ No newline at end of file diff --git a/chapter_4/lecture_4/src/main/java/Main.java b/chapter_4/lecture_4/src/main/java/Main.java deleted file mode 100644 index 33b0846..0000000 --- a/chapter_4/lecture_4/src/main/java/Main.java +++ /dev/null @@ -1,52 +0,0 @@ -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.locks.ReentrantLock; - -public class Main { - - private static int[] array = new int[10]; - private static int arrayLength = 10; - private static int numberOfThreads = 2; - private static int sum = 0; - private static ReentrantLock mutex = new ReentrantLock(); - - public static void main(String[] args) throws InterruptedException { - for (int i = 0; i < arrayLength; i++) { - array[i] = 10; - } - - List threads = new ArrayList<>(); - int threadSlice = arrayLength / numberOfThreads; - - for (int i = 0; i < numberOfThreads; i++) { - Thread t = new Thread(new MyThread(i * threadSlice, (i + 1) * threadSlice)); - t.start(); - threads.add(t); - } - - for (Thread thread : threads) { - thread.join(); - } - - System.out.println("Sum is: " + sum); - } - - static class MyThread implements Runnable { - private final int left; - private final int right; - - public MyThread(int left, int right) { - this.left = left; - this.right = right; - } - - @Override - public void run() { - for (int i = left; i < right; i++) { - mutex.lock(); - sum = sum + array[i]; - mutex.unlock(); - } - } - } -} diff --git a/chapter_4/lecture_4/build.gradle b/chapter_4/lecture_4_locks_with_parallel_vector_sum/build.gradle similarity index 100% rename from chapter_4/lecture_4/build.gradle rename to chapter_4/lecture_4_locks_with_parallel_vector_sum/build.gradle diff --git a/chapter_4/lecture_4/gradle/wrapper/gradle-wrapper.jar b/chapter_4/lecture_4_locks_with_parallel_vector_sum/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from chapter_4/lecture_4/gradle/wrapper/gradle-wrapper.jar rename to chapter_4/lecture_4_locks_with_parallel_vector_sum/gradle/wrapper/gradle-wrapper.jar diff --git a/chapter_4/lecture_4/gradle/wrapper/gradle-wrapper.properties b/chapter_4/lecture_4_locks_with_parallel_vector_sum/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from chapter_4/lecture_4/gradle/wrapper/gradle-wrapper.properties rename to chapter_4/lecture_4_locks_with_parallel_vector_sum/gradle/wrapper/gradle-wrapper.properties diff --git a/chapter_4/lecture_4/gradlew b/chapter_4/lecture_4_locks_with_parallel_vector_sum/gradlew similarity index 100% rename from chapter_4/lecture_4/gradlew rename to chapter_4/lecture_4_locks_with_parallel_vector_sum/gradlew diff --git a/chapter_4/lecture_4/gradlew.bat b/chapter_4/lecture_4_locks_with_parallel_vector_sum/gradlew.bat similarity index 100% rename from chapter_4/lecture_4/gradlew.bat rename to chapter_4/lecture_4_locks_with_parallel_vector_sum/gradlew.bat diff --git a/chapter_4/lecture_4/settings.gradle b/chapter_4/lecture_4_locks_with_parallel_vector_sum/settings.gradle similarity index 100% rename from chapter_4/lecture_4/settings.gradle rename to chapter_4/lecture_4_locks_with_parallel_vector_sum/settings.gradle diff --git a/chapter_4/lecture_4_locks_with_parallel_vector_sum/src/main/java/Main.java b/chapter_4/lecture_4_locks_with_parallel_vector_sum/src/main/java/Main.java new file mode 100644 index 0000000..5a53812 --- /dev/null +++ b/chapter_4/lecture_4_locks_with_parallel_vector_sum/src/main/java/Main.java @@ -0,0 +1,81 @@ +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; + +public class Main { + + private static int S = 0; + private static int[] array = new int[10]; + private static ReentrantLock lockObject = new ReentrantLock(); + +// public static void main(String[] args) { +// Lock lockObject = new ReentrantLock(); +// +//// synchronized (new Object()) { +//// } +// +// lockObject.tryLock(); // non-blocking, returns boolean if the lock is released or not +// +// lockObject.lock(); +// lockObject.lock(); +// lockObject.lock(); +// +// // Thread 1 is holding the lock +// System.out.println("Instruction"); +// +// lockObject.unlock(); +// +//// try { +//// } catch (Exception ignored) { +//// } finally { +//// lockObject.unlock(); +//// } +// } + + public static void main(String[] args) { + for (int i = 0; i < 10; i++) { + array[i] = 10; + } + + List threadList = new ArrayList<>(); + + int threadSlice = array.length / 2; + + // will create and execute 2 threads + for (int i = 0; i < 2; i++) { + Thread t = new Thread(new WorkerThread(i * threadSlice, (i + 1) * threadSlice)); + t.start(); + threadList.add(t); + } + + threadList.forEach(t -> { + try { + t.join(); + } catch (Exception e) { + throw new RuntimeException(e); + } + }); + + System.out.println("The sum is: " + S); + } + + static class WorkerThread implements Runnable { + private final int left; + private final int right; + public WorkerThread(int left, int right) { + this.left = left; + this.right = right; + } + + @Override + public void run() { + for (int i = left; i < right; i++) { + lockObject.lock(); + S = S + array[i]; + lockObject.unlock(); + } + } + } + +} From 94df966ddb7280b390c3e3af275e77149d87b324 Mon Sep 17 00:00:00 2001 From: jeanfern5 Date: Sun, 5 May 2024 10:15:10 -0700 Subject: [PATCH 16/40] Completed --- .../src/main/java/Main.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapter_4/lecture_4_locks_with_parallel_vector_sum/src/main/java/Main.java b/chapter_4/lecture_4_locks_with_parallel_vector_sum/src/main/java/Main.java index 5a53812..fd8ccf3 100644 --- a/chapter_4/lecture_4_locks_with_parallel_vector_sum/src/main/java/Main.java +++ b/chapter_4/lecture_4_locks_with_parallel_vector_sum/src/main/java/Main.java @@ -72,7 +72,7 @@ public WorkerThread(int left, int right) { public void run() { for (int i = left; i < right; i++) { lockObject.lock(); - S = S + array[i]; + S = S + array[i]; // critical section lockObject.unlock(); } } From 35e38f211bd98a01955428468ea75a4238576905 Mon Sep 17 00:00:00 2001 From: jeanfern5 Date: Sun, 5 May 2024 11:21:53 -0700 Subject: [PATCH 17/40] Completed --- .../build.gradle | 0 .../gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 .../gradlew | 0 .../gradlew.bat | 0 .../settings.gradle | 0 .../src/main/java/Main.java | 30 ++++++++++++------ 7 files changed, 21 insertions(+), 9 deletions(-) rename chapter_4/{lecture_5 => lecture_5_readwrite_locks_and_spin_locks}/build.gradle (100%) rename chapter_4/{lecture_5 => lecture_5_readwrite_locks_and_spin_locks}/gradle/wrapper/gradle-wrapper.jar (100%) rename chapter_4/{lecture_5 => lecture_5_readwrite_locks_and_spin_locks}/gradle/wrapper/gradle-wrapper.properties (100%) rename chapter_4/{lecture_5 => lecture_5_readwrite_locks_and_spin_locks}/gradlew (100%) rename chapter_4/{lecture_5 => lecture_5_readwrite_locks_and_spin_locks}/gradlew.bat (100%) rename chapter_4/{lecture_5 => lecture_5_readwrite_locks_and_spin_locks}/settings.gradle (100%) rename chapter_4/{lecture_5 => lecture_5_readwrite_locks_and_spin_locks}/src/main/java/Main.java (70%) diff --git a/chapter_4/lecture_5/build.gradle b/chapter_4/lecture_5_readwrite_locks_and_spin_locks/build.gradle similarity index 100% rename from chapter_4/lecture_5/build.gradle rename to chapter_4/lecture_5_readwrite_locks_and_spin_locks/build.gradle diff --git a/chapter_4/lecture_5/gradle/wrapper/gradle-wrapper.jar b/chapter_4/lecture_5_readwrite_locks_and_spin_locks/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from chapter_4/lecture_5/gradle/wrapper/gradle-wrapper.jar rename to chapter_4/lecture_5_readwrite_locks_and_spin_locks/gradle/wrapper/gradle-wrapper.jar diff --git a/chapter_4/lecture_5/gradle/wrapper/gradle-wrapper.properties b/chapter_4/lecture_5_readwrite_locks_and_spin_locks/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from chapter_4/lecture_5/gradle/wrapper/gradle-wrapper.properties rename to chapter_4/lecture_5_readwrite_locks_and_spin_locks/gradle/wrapper/gradle-wrapper.properties diff --git a/chapter_4/lecture_5/gradlew b/chapter_4/lecture_5_readwrite_locks_and_spin_locks/gradlew similarity index 100% rename from chapter_4/lecture_5/gradlew rename to chapter_4/lecture_5_readwrite_locks_and_spin_locks/gradlew diff --git a/chapter_4/lecture_5/gradlew.bat b/chapter_4/lecture_5_readwrite_locks_and_spin_locks/gradlew.bat similarity index 100% rename from chapter_4/lecture_5/gradlew.bat rename to chapter_4/lecture_5_readwrite_locks_and_spin_locks/gradlew.bat diff --git a/chapter_4/lecture_5/settings.gradle b/chapter_4/lecture_5_readwrite_locks_and_spin_locks/settings.gradle similarity index 100% rename from chapter_4/lecture_5/settings.gradle rename to chapter_4/lecture_5_readwrite_locks_and_spin_locks/settings.gradle diff --git a/chapter_4/lecture_5/src/main/java/Main.java b/chapter_4/lecture_5_readwrite_locks_and_spin_locks/src/main/java/Main.java similarity index 70% rename from chapter_4/lecture_5/src/main/java/Main.java rename to chapter_4/lecture_5_readwrite_locks_and_spin_locks/src/main/java/Main.java index 954966d..dc153cb 100644 --- a/chapter_4/lecture_5/src/main/java/Main.java +++ b/chapter_4/lecture_5_readwrite_locks_and_spin_locks/src/main/java/Main.java @@ -2,40 +2,42 @@ import java.util.List; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReadWriteLock; +import java.util.concurrent.locks.ReentrantLock; import java.util.concurrent.locks.ReentrantReadWriteLock; public class Main { - private static ReadWriteLock readWriteLock = new ReentrantReadWriteLock(); private static Lock readLock = readWriteLock.readLock(); - private static Lock writeLock = readWriteLock.writeLock(); - + private static Lock writeLock = readWriteLock.writeLock(); // write locks have priority private static List list = new ArrayList<>(); +// public static void main(String[] args) { +// Lock lock = new ReentrantLock(); +// lock.lock(); // remember to call unlock for each lock (useful to use with try/catch/finally) +// // try to keep critical sections small as possible +// lock.unlock(); // can be used for read or write +// } public static void main(String[] args) { Thread writer = new Thread(new WriterThread()); Thread reader1 = new Thread(new ReaderThread()); Thread reader2 = new Thread(new ReaderThread()); Thread reader3 = new Thread(new ReaderThread()); - Thread reader4 = new Thread(new ReaderThread()); writer.start(); reader1.start(); reader2.start(); reader3.start(); - reader4.start(); } static class WriterThread implements Runnable { - @Override public void run() { while(true) { try { writeData(); } catch (InterruptedException e) { - e.printStackTrace(); + throw new RuntimeException(e); } } } @@ -45,6 +47,7 @@ private void writeData() throws InterruptedException { writeLock.lock(); + // critical section int value = (int) (Math.random() * 10); System.out.println("Producing data: " + value); @@ -57,21 +60,25 @@ private void writeData() throws InterruptedException { } static class ReaderThread implements Runnable { - @Override public void run() { while(true) { try { readData(); } catch (InterruptedException e) { - e.printStackTrace(); + throw new RuntimeException(e); } } + } private void readData() throws InterruptedException { Thread.sleep(3000); +// readLock.lock(); - without the "spin lock", it keeps the lock in the "waiting state" + + // "spin lock" - will keep the lock in "runnable state" until the lock is available + // useful when blocking is undesirable such as OS Kernels while (true) { boolean acquired = readLock.tryLock(); if (acquired) { @@ -81,8 +88,13 @@ private void readData() throws InterruptedException { } } + // critical section System.out.println("List is: " + list); + readLock.unlock(); } } + + + } From 7fe436294bf94e5b0d0c1482aaf5bc7acb71b0cc Mon Sep 17 00:00:00 2001 From: jeanfern5 Date: Sun, 5 May 2024 11:52:57 -0700 Subject: [PATCH 18/40] Completed --- .../build.gradle | 0 .../gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 .../gradlew | 0 .../gradlew.bat | 0 .../settings.gradle | 0 .../src/main/java/Main.java | 41 +++++++++++++----- 7 files changed, 30 insertions(+), 11 deletions(-) rename chapter_4/{lecture_6 => lecture_6_condition_variable}/build.gradle (100%) rename chapter_4/{lecture_6 => lecture_6_condition_variable}/gradle/wrapper/gradle-wrapper.jar (100%) rename chapter_4/{lecture_6 => lecture_6_condition_variable}/gradle/wrapper/gradle-wrapper.properties (100%) rename chapter_4/{lecture_6 => lecture_6_condition_variable}/gradlew (100%) rename chapter_4/{lecture_6 => lecture_6_condition_variable}/gradlew.bat (100%) rename chapter_4/{lecture_6 => lecture_6_condition_variable}/settings.gradle (100%) rename chapter_4/{lecture_6 => lecture_6_condition_variable}/src/main/java/Main.java (60%) diff --git a/chapter_4/lecture_6/build.gradle b/chapter_4/lecture_6_condition_variable/build.gradle similarity index 100% rename from chapter_4/lecture_6/build.gradle rename to chapter_4/lecture_6_condition_variable/build.gradle diff --git a/chapter_4/lecture_6/gradle/wrapper/gradle-wrapper.jar b/chapter_4/lecture_6_condition_variable/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from chapter_4/lecture_6/gradle/wrapper/gradle-wrapper.jar rename to chapter_4/lecture_6_condition_variable/gradle/wrapper/gradle-wrapper.jar diff --git a/chapter_4/lecture_6/gradle/wrapper/gradle-wrapper.properties b/chapter_4/lecture_6_condition_variable/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from chapter_4/lecture_6/gradle/wrapper/gradle-wrapper.properties rename to chapter_4/lecture_6_condition_variable/gradle/wrapper/gradle-wrapper.properties diff --git a/chapter_4/lecture_6/gradlew b/chapter_4/lecture_6_condition_variable/gradlew similarity index 100% rename from chapter_4/lecture_6/gradlew rename to chapter_4/lecture_6_condition_variable/gradlew diff --git a/chapter_4/lecture_6/gradlew.bat b/chapter_4/lecture_6_condition_variable/gradlew.bat similarity index 100% rename from chapter_4/lecture_6/gradlew.bat rename to chapter_4/lecture_6_condition_variable/gradlew.bat diff --git a/chapter_4/lecture_6/settings.gradle b/chapter_4/lecture_6_condition_variable/settings.gradle similarity index 100% rename from chapter_4/lecture_6/settings.gradle rename to chapter_4/lecture_6_condition_variable/settings.gradle diff --git a/chapter_4/lecture_6/src/main/java/Main.java b/chapter_4/lecture_6_condition_variable/src/main/java/Main.java similarity index 60% rename from chapter_4/lecture_6/src/main/java/Main.java rename to chapter_4/lecture_6_condition_variable/src/main/java/Main.java index 50e1379..00e2b29 100644 --- a/chapter_4/lecture_6/src/main/java/Main.java +++ b/chapter_4/lecture_6_condition_variable/src/main/java/Main.java @@ -8,7 +8,25 @@ public class Main { private static Lock lock = new ReentrantLock(); private static Condition condition = lock.newCondition(); - private static Condition condition1 = lock.newCondition(); + +// public static void main(String[] args) throws InterruptedException { +// // condition await/signal is similar to synchronized blocks +// // the biggest advantage is that await/signal can set multiple conditions per thread while wait/notify can only do 1 object per thread +// // conditions are best for managing multiple threads based on a condition or complex producer-consumer situations +// Condition condition = lock.newCondition(); +// Condition condition1 = lock.newCondition(); +// Condition condition2 = lock.newCondition(); +// +// // Thread 1 +// lock.lock(); +// condition.await(); +// lock.unlock(); +// +// // Thread 2 +// lock.lock(); +// condition.signal(); +// lock.unlock(); +// } public static void main(String[] args) { Queue queue = new LinkedList<>(); @@ -29,16 +47,16 @@ public Producer(Queue queue) { @Override public void run() { - while(true) { + while (true) { try { - produceData(); + producerData(); } catch (InterruptedException e) { - e.printStackTrace(); + throw new RuntimeException(e); } } } - private void produceData() throws InterruptedException { + private void producerData() throws InterruptedException { lock.lock(); if (queue.size() == 10) { System.out.println("In producer, waiting..."); @@ -51,6 +69,7 @@ private void produceData() throws InterruptedException { queue.add("element_" + queue.size()); if (queue.size() == 1) { + // will unlock consumer from the waiting state condition.signal(); } lock.unlock(); @@ -58,7 +77,6 @@ private void produceData() throws InterruptedException { } static class Consumer implements Runnable { - private final Queue queue; public Consumer(Queue queue) { @@ -69,26 +87,27 @@ public Consumer(Queue queue) { public void run() { while (true) { try { - consumeData(); + consumerData(); } catch (InterruptedException e) { - e.printStackTrace(); + throw new RuntimeException(e); } } } - private void consumeData() throws InterruptedException { + private void consumerData() throws InterruptedException { lock.lock(); if (queue.isEmpty()) { - System.out.println("Consumer is waiting..."); + System.out.println("Consumer is waiting ..."); condition.await(); } Thread.sleep(700); String data = queue.remove(); - System.out.println("Consumed data: " + data); + System.out.println("Consumer data: " + data); if (queue.size() == 9) { + // will unlock producer from the waiting state condition.signal(); } lock.unlock(); From 34b5938c0f36136692d783d5a94700e7c15a9f97 Mon Sep 17 00:00:00 2001 From: jeanfern5 Date: Sun, 5 May 2024 12:40:41 -0700 Subject: [PATCH 19/40] Completed --- chapter_4/lecture_7/src/main/java/Main.java | 51 -------------- .../build.gradle | 0 .../gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 .../gradlew | 0 .../gradlew.bat | 0 .../settings.gradle | 0 .../src/main/java/Main.java | 65 ++++++++++++++++++ 8 files changed, 65 insertions(+), 51 deletions(-) delete mode 100644 chapter_4/lecture_7/src/main/java/Main.java rename chapter_4/{lecture_7 => lecture_7_semaphores}/build.gradle (100%) rename chapter_4/{lecture_7 => lecture_7_semaphores}/gradle/wrapper/gradle-wrapper.jar (100%) rename chapter_4/{lecture_7 => lecture_7_semaphores}/gradle/wrapper/gradle-wrapper.properties (100%) rename chapter_4/{lecture_7 => lecture_7_semaphores}/gradlew (100%) rename chapter_4/{lecture_7 => lecture_7_semaphores}/gradlew.bat (100%) rename chapter_4/{lecture_7 => lecture_7_semaphores}/settings.gradle (100%) create mode 100644 chapter_4/lecture_7_semaphores/src/main/java/Main.java diff --git a/chapter_4/lecture_7/src/main/java/Main.java b/chapter_4/lecture_7/src/main/java/Main.java deleted file mode 100644 index 8b6cc27..0000000 --- a/chapter_4/lecture_7/src/main/java/Main.java +++ /dev/null @@ -1,51 +0,0 @@ -import java.util.concurrent.Semaphore; -import java.util.concurrent.locks.Lock; -import java.util.concurrent.locks.ReentrantLock; - -public class Main { - - private static Semaphore semaphore = new Semaphore(2); - - public static void main(String[] args) throws InterruptedException { - - Executor executor = new Executor(); - - executor.submit(new Job(4000)); - executor.submit(new Job(5000)); - executor.submit(new Job(3000)); - } - - static class Executor { - public void submit(Job job) throws InterruptedException { - System.out.println("Launching job " + job.getWork()); - semaphore.acquire(); - - Thread t = new Thread(() -> { - try { - System.out.println("Executing job " + job.getWork()); - Thread.sleep(job.getWork()); - - semaphore.release(); - System.out.println("Job finished with id " + job.getWork()); - - } catch (InterruptedException e) { - e.printStackTrace(); - } - }); - - t.start(); - } - } - - static class Job { - private final int work; - - public Job(int work) { - this.work = work; - } - - public int getWork() { - return work; - } - } -} diff --git a/chapter_4/lecture_7/build.gradle b/chapter_4/lecture_7_semaphores/build.gradle similarity index 100% rename from chapter_4/lecture_7/build.gradle rename to chapter_4/lecture_7_semaphores/build.gradle diff --git a/chapter_4/lecture_7/gradle/wrapper/gradle-wrapper.jar b/chapter_4/lecture_7_semaphores/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from chapter_4/lecture_7/gradle/wrapper/gradle-wrapper.jar rename to chapter_4/lecture_7_semaphores/gradle/wrapper/gradle-wrapper.jar diff --git a/chapter_4/lecture_7/gradle/wrapper/gradle-wrapper.properties b/chapter_4/lecture_7_semaphores/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from chapter_4/lecture_7/gradle/wrapper/gradle-wrapper.properties rename to chapter_4/lecture_7_semaphores/gradle/wrapper/gradle-wrapper.properties diff --git a/chapter_4/lecture_7/gradlew b/chapter_4/lecture_7_semaphores/gradlew similarity index 100% rename from chapter_4/lecture_7/gradlew rename to chapter_4/lecture_7_semaphores/gradlew diff --git a/chapter_4/lecture_7/gradlew.bat b/chapter_4/lecture_7_semaphores/gradlew.bat similarity index 100% rename from chapter_4/lecture_7/gradlew.bat rename to chapter_4/lecture_7_semaphores/gradlew.bat diff --git a/chapter_4/lecture_7/settings.gradle b/chapter_4/lecture_7_semaphores/settings.gradle similarity index 100% rename from chapter_4/lecture_7/settings.gradle rename to chapter_4/lecture_7_semaphores/settings.gradle diff --git a/chapter_4/lecture_7_semaphores/src/main/java/Main.java b/chapter_4/lecture_7_semaphores/src/main/java/Main.java new file mode 100644 index 0000000..82a86f2 --- /dev/null +++ b/chapter_4/lecture_7_semaphores/src/main/java/Main.java @@ -0,0 +1,65 @@ +import java.util.concurrent.Semaphore; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; + +public class Main { + // similar to a lock but more complex + private static Semaphore semaphore = new Semaphore(2); + +// public static void main(String[] args) throws InterruptedException { +// // you can set negative permits which will require release to be called until >=1 is available +// Semaphore semaphore = new Semaphore(5); +// Lock lock = new ReentrantLock(); +// +// // only one thread can execute critical section +// lock.lock(); +// // critical section +// lock.unlock(); +// +// // multiple threads can execute critical section based on the permits allotted +// semaphore.acquire(); // lock +// // critical section +// semaphore.release(); // unlock +// } + + public static void main(String[] args) throws InterruptedException { + Executor executor = new Executor(); + + executor.submit(new Job(5000)); + executor.submit(new Job(10000)); + executor.submit(new Job(1000)); + } + + static class Executor { + public void submit(Job job) throws InterruptedException { + System.out.println("Launching job: " + job.getWork()); + semaphore.acquire(); + + Thread t = new Thread(() -> { + try { + System.out.println("Executing job: " + job.getWork()); + Thread.sleep(job.getWork()); + + semaphore.release(); + System.out.println("Job finished with id: " + job.getWork()); + } catch (InterruptedException e) { + e.printStackTrace(); + } + }); + + t.start(); + } + } + + static class Job { + private final int work; + + public Job (int work) { + this.work = work; + } + + public int getWork() { + return work; + } + } +} From 0a924d99c4a785bda8ae6f39e2a6bf56730d0ebe Mon Sep 17 00:00:00 2001 From: jeanfern5 Date: Sun, 5 May 2024 12:42:03 -0700 Subject: [PATCH 20/40] Completed --- .../lecture_2_synchronized_keyword/build.gradle | 0 .../gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 .../lecture_2_synchronized_keyword/gradlew | 0 .../lecture_2_synchronized_keyword/gradlew.bat | 0 .../lecture_2_synchronized_keyword/settings.gradle | 0 .../src/main/java/Main.java | 0 .../build.gradle | 0 .../gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 .../lecture_3_wait_sets_and_notifications/gradlew | 0 .../gradlew.bat | 0 .../settings.gradle | 0 .../src/main/java/Main.java | 0 .../build.gradle | 0 .../gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 .../gradlew | 0 .../gradlew.bat | 0 .../settings.gradle | 0 .../src/main/java/Main.java | 0 .../build.gradle | 0 .../gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 .../gradlew | 0 .../gradlew.bat | 0 .../settings.gradle | 0 .../src/main/java/Main.java | 0 .../lecture_6_condition_variable/build.gradle | 0 .../gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 .../lecture_6_condition_variable/gradlew | 0 .../lecture_6_condition_variable/gradlew.bat | 0 .../lecture_6_condition_variable/settings.gradle | 0 .../src/main/java/Main.java | 0 .../lecture_7_semaphores/build.gradle | 0 .../gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 .../lecture_7_semaphores/gradlew | 0 .../lecture_7_semaphores/gradlew.bat | 0 .../lecture_7_semaphores/settings.gradle | 0 .../lecture_7_semaphores/src/main/java/Main.java | 0 42 files changed, 0 insertions(+), 0 deletions(-) rename {chapter_4 => chapter_4_thread_synchronization_part1}/lecture_2_synchronized_keyword/build.gradle (100%) rename {chapter_4 => chapter_4_thread_synchronization_part1}/lecture_2_synchronized_keyword/gradle/wrapper/gradle-wrapper.jar (100%) rename {chapter_4 => chapter_4_thread_synchronization_part1}/lecture_2_synchronized_keyword/gradle/wrapper/gradle-wrapper.properties (100%) rename {chapter_4 => chapter_4_thread_synchronization_part1}/lecture_2_synchronized_keyword/gradlew (100%) rename {chapter_4 => chapter_4_thread_synchronization_part1}/lecture_2_synchronized_keyword/gradlew.bat (100%) rename {chapter_4 => chapter_4_thread_synchronization_part1}/lecture_2_synchronized_keyword/settings.gradle (100%) rename {chapter_4 => chapter_4_thread_synchronization_part1}/lecture_2_synchronized_keyword/src/main/java/Main.java (100%) rename {chapter_4 => chapter_4_thread_synchronization_part1}/lecture_3_wait_sets_and_notifications/build.gradle (100%) rename {chapter_4 => chapter_4_thread_synchronization_part1}/lecture_3_wait_sets_and_notifications/gradle/wrapper/gradle-wrapper.jar (100%) rename {chapter_4 => chapter_4_thread_synchronization_part1}/lecture_3_wait_sets_and_notifications/gradle/wrapper/gradle-wrapper.properties (100%) rename {chapter_4 => chapter_4_thread_synchronization_part1}/lecture_3_wait_sets_and_notifications/gradlew (100%) rename {chapter_4 => chapter_4_thread_synchronization_part1}/lecture_3_wait_sets_and_notifications/gradlew.bat (100%) rename {chapter_4 => chapter_4_thread_synchronization_part1}/lecture_3_wait_sets_and_notifications/settings.gradle (100%) rename {chapter_4 => chapter_4_thread_synchronization_part1}/lecture_3_wait_sets_and_notifications/src/main/java/Main.java (100%) rename {chapter_4 => chapter_4_thread_synchronization_part1}/lecture_4_locks_with_parallel_vector_sum/build.gradle (100%) rename {chapter_4 => chapter_4_thread_synchronization_part1}/lecture_4_locks_with_parallel_vector_sum/gradle/wrapper/gradle-wrapper.jar (100%) rename {chapter_4 => chapter_4_thread_synchronization_part1}/lecture_4_locks_with_parallel_vector_sum/gradle/wrapper/gradle-wrapper.properties (100%) rename {chapter_4 => chapter_4_thread_synchronization_part1}/lecture_4_locks_with_parallel_vector_sum/gradlew (100%) rename {chapter_4 => chapter_4_thread_synchronization_part1}/lecture_4_locks_with_parallel_vector_sum/gradlew.bat (100%) rename {chapter_4 => chapter_4_thread_synchronization_part1}/lecture_4_locks_with_parallel_vector_sum/settings.gradle (100%) rename {chapter_4 => chapter_4_thread_synchronization_part1}/lecture_4_locks_with_parallel_vector_sum/src/main/java/Main.java (100%) rename {chapter_4 => chapter_4_thread_synchronization_part1}/lecture_5_readwrite_locks_and_spin_locks/build.gradle (100%) rename {chapter_4 => chapter_4_thread_synchronization_part1}/lecture_5_readwrite_locks_and_spin_locks/gradle/wrapper/gradle-wrapper.jar (100%) rename {chapter_4 => chapter_4_thread_synchronization_part1}/lecture_5_readwrite_locks_and_spin_locks/gradle/wrapper/gradle-wrapper.properties (100%) rename {chapter_4 => chapter_4_thread_synchronization_part1}/lecture_5_readwrite_locks_and_spin_locks/gradlew (100%) rename {chapter_4 => chapter_4_thread_synchronization_part1}/lecture_5_readwrite_locks_and_spin_locks/gradlew.bat (100%) rename {chapter_4 => chapter_4_thread_synchronization_part1}/lecture_5_readwrite_locks_and_spin_locks/settings.gradle (100%) rename {chapter_4 => chapter_4_thread_synchronization_part1}/lecture_5_readwrite_locks_and_spin_locks/src/main/java/Main.java (100%) rename {chapter_4 => chapter_4_thread_synchronization_part1}/lecture_6_condition_variable/build.gradle (100%) rename {chapter_4 => chapter_4_thread_synchronization_part1}/lecture_6_condition_variable/gradle/wrapper/gradle-wrapper.jar (100%) rename {chapter_4 => chapter_4_thread_synchronization_part1}/lecture_6_condition_variable/gradle/wrapper/gradle-wrapper.properties (100%) rename {chapter_4 => chapter_4_thread_synchronization_part1}/lecture_6_condition_variable/gradlew (100%) rename {chapter_4 => chapter_4_thread_synchronization_part1}/lecture_6_condition_variable/gradlew.bat (100%) rename {chapter_4 => chapter_4_thread_synchronization_part1}/lecture_6_condition_variable/settings.gradle (100%) rename {chapter_4 => chapter_4_thread_synchronization_part1}/lecture_6_condition_variable/src/main/java/Main.java (100%) rename {chapter_4 => chapter_4_thread_synchronization_part1}/lecture_7_semaphores/build.gradle (100%) rename {chapter_4 => chapter_4_thread_synchronization_part1}/lecture_7_semaphores/gradle/wrapper/gradle-wrapper.jar (100%) rename {chapter_4 => chapter_4_thread_synchronization_part1}/lecture_7_semaphores/gradle/wrapper/gradle-wrapper.properties (100%) rename {chapter_4 => chapter_4_thread_synchronization_part1}/lecture_7_semaphores/gradlew (100%) rename {chapter_4 => chapter_4_thread_synchronization_part1}/lecture_7_semaphores/gradlew.bat (100%) rename {chapter_4 => chapter_4_thread_synchronization_part1}/lecture_7_semaphores/settings.gradle (100%) rename {chapter_4 => chapter_4_thread_synchronization_part1}/lecture_7_semaphores/src/main/java/Main.java (100%) diff --git a/chapter_4/lecture_2_synchronized_keyword/build.gradle b/chapter_4_thread_synchronization_part1/lecture_2_synchronized_keyword/build.gradle similarity index 100% rename from chapter_4/lecture_2_synchronized_keyword/build.gradle rename to chapter_4_thread_synchronization_part1/lecture_2_synchronized_keyword/build.gradle diff --git a/chapter_4/lecture_2_synchronized_keyword/gradle/wrapper/gradle-wrapper.jar b/chapter_4_thread_synchronization_part1/lecture_2_synchronized_keyword/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from chapter_4/lecture_2_synchronized_keyword/gradle/wrapper/gradle-wrapper.jar rename to chapter_4_thread_synchronization_part1/lecture_2_synchronized_keyword/gradle/wrapper/gradle-wrapper.jar diff --git a/chapter_4/lecture_2_synchronized_keyword/gradle/wrapper/gradle-wrapper.properties b/chapter_4_thread_synchronization_part1/lecture_2_synchronized_keyword/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from chapter_4/lecture_2_synchronized_keyword/gradle/wrapper/gradle-wrapper.properties rename to chapter_4_thread_synchronization_part1/lecture_2_synchronized_keyword/gradle/wrapper/gradle-wrapper.properties diff --git a/chapter_4/lecture_2_synchronized_keyword/gradlew b/chapter_4_thread_synchronization_part1/lecture_2_synchronized_keyword/gradlew similarity index 100% rename from chapter_4/lecture_2_synchronized_keyword/gradlew rename to chapter_4_thread_synchronization_part1/lecture_2_synchronized_keyword/gradlew diff --git a/chapter_4/lecture_2_synchronized_keyword/gradlew.bat b/chapter_4_thread_synchronization_part1/lecture_2_synchronized_keyword/gradlew.bat similarity index 100% rename from chapter_4/lecture_2_synchronized_keyword/gradlew.bat rename to chapter_4_thread_synchronization_part1/lecture_2_synchronized_keyword/gradlew.bat diff --git a/chapter_4/lecture_2_synchronized_keyword/settings.gradle b/chapter_4_thread_synchronization_part1/lecture_2_synchronized_keyword/settings.gradle similarity index 100% rename from chapter_4/lecture_2_synchronized_keyword/settings.gradle rename to chapter_4_thread_synchronization_part1/lecture_2_synchronized_keyword/settings.gradle diff --git a/chapter_4/lecture_2_synchronized_keyword/src/main/java/Main.java b/chapter_4_thread_synchronization_part1/lecture_2_synchronized_keyword/src/main/java/Main.java similarity index 100% rename from chapter_4/lecture_2_synchronized_keyword/src/main/java/Main.java rename to chapter_4_thread_synchronization_part1/lecture_2_synchronized_keyword/src/main/java/Main.java diff --git a/chapter_4/lecture_3_wait_sets_and_notifications/build.gradle b/chapter_4_thread_synchronization_part1/lecture_3_wait_sets_and_notifications/build.gradle similarity index 100% rename from chapter_4/lecture_3_wait_sets_and_notifications/build.gradle rename to chapter_4_thread_synchronization_part1/lecture_3_wait_sets_and_notifications/build.gradle diff --git a/chapter_4/lecture_3_wait_sets_and_notifications/gradle/wrapper/gradle-wrapper.jar b/chapter_4_thread_synchronization_part1/lecture_3_wait_sets_and_notifications/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from chapter_4/lecture_3_wait_sets_and_notifications/gradle/wrapper/gradle-wrapper.jar rename to chapter_4_thread_synchronization_part1/lecture_3_wait_sets_and_notifications/gradle/wrapper/gradle-wrapper.jar diff --git a/chapter_4/lecture_3_wait_sets_and_notifications/gradle/wrapper/gradle-wrapper.properties b/chapter_4_thread_synchronization_part1/lecture_3_wait_sets_and_notifications/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from chapter_4/lecture_3_wait_sets_and_notifications/gradle/wrapper/gradle-wrapper.properties rename to chapter_4_thread_synchronization_part1/lecture_3_wait_sets_and_notifications/gradle/wrapper/gradle-wrapper.properties diff --git a/chapter_4/lecture_3_wait_sets_and_notifications/gradlew b/chapter_4_thread_synchronization_part1/lecture_3_wait_sets_and_notifications/gradlew similarity index 100% rename from chapter_4/lecture_3_wait_sets_and_notifications/gradlew rename to chapter_4_thread_synchronization_part1/lecture_3_wait_sets_and_notifications/gradlew diff --git a/chapter_4/lecture_3_wait_sets_and_notifications/gradlew.bat b/chapter_4_thread_synchronization_part1/lecture_3_wait_sets_and_notifications/gradlew.bat similarity index 100% rename from chapter_4/lecture_3_wait_sets_and_notifications/gradlew.bat rename to chapter_4_thread_synchronization_part1/lecture_3_wait_sets_and_notifications/gradlew.bat diff --git a/chapter_4/lecture_3_wait_sets_and_notifications/settings.gradle b/chapter_4_thread_synchronization_part1/lecture_3_wait_sets_and_notifications/settings.gradle similarity index 100% rename from chapter_4/lecture_3_wait_sets_and_notifications/settings.gradle rename to chapter_4_thread_synchronization_part1/lecture_3_wait_sets_and_notifications/settings.gradle diff --git a/chapter_4/lecture_3_wait_sets_and_notifications/src/main/java/Main.java b/chapter_4_thread_synchronization_part1/lecture_3_wait_sets_and_notifications/src/main/java/Main.java similarity index 100% rename from chapter_4/lecture_3_wait_sets_and_notifications/src/main/java/Main.java rename to chapter_4_thread_synchronization_part1/lecture_3_wait_sets_and_notifications/src/main/java/Main.java diff --git a/chapter_4/lecture_4_locks_with_parallel_vector_sum/build.gradle b/chapter_4_thread_synchronization_part1/lecture_4_locks_with_parallel_vector_sum/build.gradle similarity index 100% rename from chapter_4/lecture_4_locks_with_parallel_vector_sum/build.gradle rename to chapter_4_thread_synchronization_part1/lecture_4_locks_with_parallel_vector_sum/build.gradle diff --git a/chapter_4/lecture_4_locks_with_parallel_vector_sum/gradle/wrapper/gradle-wrapper.jar b/chapter_4_thread_synchronization_part1/lecture_4_locks_with_parallel_vector_sum/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from chapter_4/lecture_4_locks_with_parallel_vector_sum/gradle/wrapper/gradle-wrapper.jar rename to chapter_4_thread_synchronization_part1/lecture_4_locks_with_parallel_vector_sum/gradle/wrapper/gradle-wrapper.jar diff --git a/chapter_4/lecture_4_locks_with_parallel_vector_sum/gradle/wrapper/gradle-wrapper.properties b/chapter_4_thread_synchronization_part1/lecture_4_locks_with_parallel_vector_sum/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from chapter_4/lecture_4_locks_with_parallel_vector_sum/gradle/wrapper/gradle-wrapper.properties rename to chapter_4_thread_synchronization_part1/lecture_4_locks_with_parallel_vector_sum/gradle/wrapper/gradle-wrapper.properties diff --git a/chapter_4/lecture_4_locks_with_parallel_vector_sum/gradlew b/chapter_4_thread_synchronization_part1/lecture_4_locks_with_parallel_vector_sum/gradlew similarity index 100% rename from chapter_4/lecture_4_locks_with_parallel_vector_sum/gradlew rename to chapter_4_thread_synchronization_part1/lecture_4_locks_with_parallel_vector_sum/gradlew diff --git a/chapter_4/lecture_4_locks_with_parallel_vector_sum/gradlew.bat b/chapter_4_thread_synchronization_part1/lecture_4_locks_with_parallel_vector_sum/gradlew.bat similarity index 100% rename from chapter_4/lecture_4_locks_with_parallel_vector_sum/gradlew.bat rename to chapter_4_thread_synchronization_part1/lecture_4_locks_with_parallel_vector_sum/gradlew.bat diff --git a/chapter_4/lecture_4_locks_with_parallel_vector_sum/settings.gradle b/chapter_4_thread_synchronization_part1/lecture_4_locks_with_parallel_vector_sum/settings.gradle similarity index 100% rename from chapter_4/lecture_4_locks_with_parallel_vector_sum/settings.gradle rename to chapter_4_thread_synchronization_part1/lecture_4_locks_with_parallel_vector_sum/settings.gradle diff --git a/chapter_4/lecture_4_locks_with_parallel_vector_sum/src/main/java/Main.java b/chapter_4_thread_synchronization_part1/lecture_4_locks_with_parallel_vector_sum/src/main/java/Main.java similarity index 100% rename from chapter_4/lecture_4_locks_with_parallel_vector_sum/src/main/java/Main.java rename to chapter_4_thread_synchronization_part1/lecture_4_locks_with_parallel_vector_sum/src/main/java/Main.java diff --git a/chapter_4/lecture_5_readwrite_locks_and_spin_locks/build.gradle b/chapter_4_thread_synchronization_part1/lecture_5_readwrite_locks_and_spin_locks/build.gradle similarity index 100% rename from chapter_4/lecture_5_readwrite_locks_and_spin_locks/build.gradle rename to chapter_4_thread_synchronization_part1/lecture_5_readwrite_locks_and_spin_locks/build.gradle diff --git a/chapter_4/lecture_5_readwrite_locks_and_spin_locks/gradle/wrapper/gradle-wrapper.jar b/chapter_4_thread_synchronization_part1/lecture_5_readwrite_locks_and_spin_locks/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from chapter_4/lecture_5_readwrite_locks_and_spin_locks/gradle/wrapper/gradle-wrapper.jar rename to chapter_4_thread_synchronization_part1/lecture_5_readwrite_locks_and_spin_locks/gradle/wrapper/gradle-wrapper.jar diff --git a/chapter_4/lecture_5_readwrite_locks_and_spin_locks/gradle/wrapper/gradle-wrapper.properties b/chapter_4_thread_synchronization_part1/lecture_5_readwrite_locks_and_spin_locks/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from chapter_4/lecture_5_readwrite_locks_and_spin_locks/gradle/wrapper/gradle-wrapper.properties rename to chapter_4_thread_synchronization_part1/lecture_5_readwrite_locks_and_spin_locks/gradle/wrapper/gradle-wrapper.properties diff --git a/chapter_4/lecture_5_readwrite_locks_and_spin_locks/gradlew b/chapter_4_thread_synchronization_part1/lecture_5_readwrite_locks_and_spin_locks/gradlew similarity index 100% rename from chapter_4/lecture_5_readwrite_locks_and_spin_locks/gradlew rename to chapter_4_thread_synchronization_part1/lecture_5_readwrite_locks_and_spin_locks/gradlew diff --git a/chapter_4/lecture_5_readwrite_locks_and_spin_locks/gradlew.bat b/chapter_4_thread_synchronization_part1/lecture_5_readwrite_locks_and_spin_locks/gradlew.bat similarity index 100% rename from chapter_4/lecture_5_readwrite_locks_and_spin_locks/gradlew.bat rename to chapter_4_thread_synchronization_part1/lecture_5_readwrite_locks_and_spin_locks/gradlew.bat diff --git a/chapter_4/lecture_5_readwrite_locks_and_spin_locks/settings.gradle b/chapter_4_thread_synchronization_part1/lecture_5_readwrite_locks_and_spin_locks/settings.gradle similarity index 100% rename from chapter_4/lecture_5_readwrite_locks_and_spin_locks/settings.gradle rename to chapter_4_thread_synchronization_part1/lecture_5_readwrite_locks_and_spin_locks/settings.gradle diff --git a/chapter_4/lecture_5_readwrite_locks_and_spin_locks/src/main/java/Main.java b/chapter_4_thread_synchronization_part1/lecture_5_readwrite_locks_and_spin_locks/src/main/java/Main.java similarity index 100% rename from chapter_4/lecture_5_readwrite_locks_and_spin_locks/src/main/java/Main.java rename to chapter_4_thread_synchronization_part1/lecture_5_readwrite_locks_and_spin_locks/src/main/java/Main.java diff --git a/chapter_4/lecture_6_condition_variable/build.gradle b/chapter_4_thread_synchronization_part1/lecture_6_condition_variable/build.gradle similarity index 100% rename from chapter_4/lecture_6_condition_variable/build.gradle rename to chapter_4_thread_synchronization_part1/lecture_6_condition_variable/build.gradle diff --git a/chapter_4/lecture_6_condition_variable/gradle/wrapper/gradle-wrapper.jar b/chapter_4_thread_synchronization_part1/lecture_6_condition_variable/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from chapter_4/lecture_6_condition_variable/gradle/wrapper/gradle-wrapper.jar rename to chapter_4_thread_synchronization_part1/lecture_6_condition_variable/gradle/wrapper/gradle-wrapper.jar diff --git a/chapter_4/lecture_6_condition_variable/gradle/wrapper/gradle-wrapper.properties b/chapter_4_thread_synchronization_part1/lecture_6_condition_variable/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from chapter_4/lecture_6_condition_variable/gradle/wrapper/gradle-wrapper.properties rename to chapter_4_thread_synchronization_part1/lecture_6_condition_variable/gradle/wrapper/gradle-wrapper.properties diff --git a/chapter_4/lecture_6_condition_variable/gradlew b/chapter_4_thread_synchronization_part1/lecture_6_condition_variable/gradlew similarity index 100% rename from chapter_4/lecture_6_condition_variable/gradlew rename to chapter_4_thread_synchronization_part1/lecture_6_condition_variable/gradlew diff --git a/chapter_4/lecture_6_condition_variable/gradlew.bat b/chapter_4_thread_synchronization_part1/lecture_6_condition_variable/gradlew.bat similarity index 100% rename from chapter_4/lecture_6_condition_variable/gradlew.bat rename to chapter_4_thread_synchronization_part1/lecture_6_condition_variable/gradlew.bat diff --git a/chapter_4/lecture_6_condition_variable/settings.gradle b/chapter_4_thread_synchronization_part1/lecture_6_condition_variable/settings.gradle similarity index 100% rename from chapter_4/lecture_6_condition_variable/settings.gradle rename to chapter_4_thread_synchronization_part1/lecture_6_condition_variable/settings.gradle diff --git a/chapter_4/lecture_6_condition_variable/src/main/java/Main.java b/chapter_4_thread_synchronization_part1/lecture_6_condition_variable/src/main/java/Main.java similarity index 100% rename from chapter_4/lecture_6_condition_variable/src/main/java/Main.java rename to chapter_4_thread_synchronization_part1/lecture_6_condition_variable/src/main/java/Main.java diff --git a/chapter_4/lecture_7_semaphores/build.gradle b/chapter_4_thread_synchronization_part1/lecture_7_semaphores/build.gradle similarity index 100% rename from chapter_4/lecture_7_semaphores/build.gradle rename to chapter_4_thread_synchronization_part1/lecture_7_semaphores/build.gradle diff --git a/chapter_4/lecture_7_semaphores/gradle/wrapper/gradle-wrapper.jar b/chapter_4_thread_synchronization_part1/lecture_7_semaphores/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from chapter_4/lecture_7_semaphores/gradle/wrapper/gradle-wrapper.jar rename to chapter_4_thread_synchronization_part1/lecture_7_semaphores/gradle/wrapper/gradle-wrapper.jar diff --git a/chapter_4/lecture_7_semaphores/gradle/wrapper/gradle-wrapper.properties b/chapter_4_thread_synchronization_part1/lecture_7_semaphores/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from chapter_4/lecture_7_semaphores/gradle/wrapper/gradle-wrapper.properties rename to chapter_4_thread_synchronization_part1/lecture_7_semaphores/gradle/wrapper/gradle-wrapper.properties diff --git a/chapter_4/lecture_7_semaphores/gradlew b/chapter_4_thread_synchronization_part1/lecture_7_semaphores/gradlew similarity index 100% rename from chapter_4/lecture_7_semaphores/gradlew rename to chapter_4_thread_synchronization_part1/lecture_7_semaphores/gradlew diff --git a/chapter_4/lecture_7_semaphores/gradlew.bat b/chapter_4_thread_synchronization_part1/lecture_7_semaphores/gradlew.bat similarity index 100% rename from chapter_4/lecture_7_semaphores/gradlew.bat rename to chapter_4_thread_synchronization_part1/lecture_7_semaphores/gradlew.bat diff --git a/chapter_4/lecture_7_semaphores/settings.gradle b/chapter_4_thread_synchronization_part1/lecture_7_semaphores/settings.gradle similarity index 100% rename from chapter_4/lecture_7_semaphores/settings.gradle rename to chapter_4_thread_synchronization_part1/lecture_7_semaphores/settings.gradle diff --git a/chapter_4/lecture_7_semaphores/src/main/java/Main.java b/chapter_4_thread_synchronization_part1/lecture_7_semaphores/src/main/java/Main.java similarity index 100% rename from chapter_4/lecture_7_semaphores/src/main/java/Main.java rename to chapter_4_thread_synchronization_part1/lecture_7_semaphores/src/main/java/Main.java From 5d505702136d62f0e6d3f45c42a98768ac8160e2 Mon Sep 17 00:00:00 2001 From: jeanfern5 Date: Sun, 5 May 2024 14:58:29 -0700 Subject: [PATCH 21/40] Completed --- .../build.gradle | 0 .../gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 .../gradlew | 0 .../gradlew.bat | 0 .../settings.gradle | 0 .../src/main/java/Main.java | 16 +++++++++------- 7 files changed, 9 insertions(+), 7 deletions(-) rename chapter_5/{lecture_1 => lecture_1_count_down_latch}/build.gradle (100%) rename chapter_5/{lecture_1 => lecture_1_count_down_latch}/gradle/wrapper/gradle-wrapper.jar (100%) rename chapter_5/{lecture_1 => lecture_1_count_down_latch}/gradle/wrapper/gradle-wrapper.properties (100%) rename chapter_5/{lecture_1 => lecture_1_count_down_latch}/gradlew (100%) rename chapter_5/{lecture_1 => lecture_1_count_down_latch}/gradlew.bat (100%) rename chapter_5/{lecture_1 => lecture_1_count_down_latch}/settings.gradle (100%) rename chapter_5/{lecture_1 => lecture_1_count_down_latch}/src/main/java/Main.java (63%) diff --git a/chapter_5/lecture_1/build.gradle b/chapter_5/lecture_1_count_down_latch/build.gradle similarity index 100% rename from chapter_5/lecture_1/build.gradle rename to chapter_5/lecture_1_count_down_latch/build.gradle diff --git a/chapter_5/lecture_1/gradle/wrapper/gradle-wrapper.jar b/chapter_5/lecture_1_count_down_latch/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from chapter_5/lecture_1/gradle/wrapper/gradle-wrapper.jar rename to chapter_5/lecture_1_count_down_latch/gradle/wrapper/gradle-wrapper.jar diff --git a/chapter_5/lecture_1/gradle/wrapper/gradle-wrapper.properties b/chapter_5/lecture_1_count_down_latch/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from chapter_5/lecture_1/gradle/wrapper/gradle-wrapper.properties rename to chapter_5/lecture_1_count_down_latch/gradle/wrapper/gradle-wrapper.properties diff --git a/chapter_5/lecture_1/gradlew b/chapter_5/lecture_1_count_down_latch/gradlew similarity index 100% rename from chapter_5/lecture_1/gradlew rename to chapter_5/lecture_1_count_down_latch/gradlew diff --git a/chapter_5/lecture_1/gradlew.bat b/chapter_5/lecture_1_count_down_latch/gradlew.bat similarity index 100% rename from chapter_5/lecture_1/gradlew.bat rename to chapter_5/lecture_1_count_down_latch/gradlew.bat diff --git a/chapter_5/lecture_1/settings.gradle b/chapter_5/lecture_1_count_down_latch/settings.gradle similarity index 100% rename from chapter_5/lecture_1/settings.gradle rename to chapter_5/lecture_1_count_down_latch/settings.gradle diff --git a/chapter_5/lecture_1/src/main/java/Main.java b/chapter_5/lecture_1_count_down_latch/src/main/java/Main.java similarity index 63% rename from chapter_5/lecture_1/src/main/java/Main.java rename to chapter_5/lecture_1_count_down_latch/src/main/java/Main.java index fc1bc88..4ad23ab 100644 --- a/chapter_5/lecture_1/src/main/java/Main.java +++ b/chapter_5/lecture_1_count_down_latch/src/main/java/Main.java @@ -1,25 +1,27 @@ import java.util.concurrent.CountDownLatch; public class Main { - private static int foundPosition = 0; private static int numberOfThreads = 2; - private static int numberToSearch = 8; + private static int numberToSearch = 9; private static int[] array = new int[] { 1, 2, 3, 4, 5, 6, 7, 8 }; + private static CountDownLatch countDownLatch = new CountDownLatch(numberOfThreads); // one shot tool, once countdown reaches zero it will latch/lock - private static CountDownLatch countDownLatch = new CountDownLatch(numberOfThreads); - +// public static void main(String[] args) throws InterruptedException { +// CountDownLatch countDownLatch = new CountDownLatch(6); // one shot tool, once countdown reaches zero it will latch/lock +// countDownLatch.countDown(); // counts down from int provided above +// countDownLatch.await(); // waits until int above reaches zero +// } public static void main(String[] args) throws InterruptedException { int threadSlice = array.length / numberOfThreads; - for (int i = 0; i < numberOfThreads; i++) { + for (int i = 0; i < numberOfThreads; i++ ) { Thread t = new Thread(new WorkerThread(i * threadSlice, (i + 1) * threadSlice)); t.start(); } - countDownLatch.await(); - System.out.println("The number was found on position: " + foundPosition); + System.out.println("The number was found on position " + foundPosition); } static class WorkerThread implements Runnable { From 5bd5c07387dd153bc2458356799b6d1a9ddfe5fb Mon Sep 17 00:00:00 2001 From: jeanfern5 Date: Sun, 12 May 2024 14:28:46 -0700 Subject: [PATCH 22/40] Completed --- .../build.gradle | 0 .../gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 .../gradlew | 0 .../gradlew.bat | 0 .../settings.gradle | 0 .../src/main/java/Main.java | 15 ++++++++++++--- 7 files changed, 12 insertions(+), 3 deletions(-) rename chapter_5/{lecture_2 => lecture_2_cyclic_barrier}/build.gradle (100%) rename chapter_5/{lecture_2 => lecture_2_cyclic_barrier}/gradle/wrapper/gradle-wrapper.jar (100%) rename chapter_5/{lecture_2 => lecture_2_cyclic_barrier}/gradle/wrapper/gradle-wrapper.properties (100%) rename chapter_5/{lecture_2 => lecture_2_cyclic_barrier}/gradlew (100%) rename chapter_5/{lecture_2 => lecture_2_cyclic_barrier}/gradlew.bat (100%) rename chapter_5/{lecture_2 => lecture_2_cyclic_barrier}/settings.gradle (100%) rename chapter_5/{lecture_2 => lecture_2_cyclic_barrier}/src/main/java/Main.java (67%) diff --git a/chapter_5/lecture_2/build.gradle b/chapter_5/lecture_2_cyclic_barrier/build.gradle similarity index 100% rename from chapter_5/lecture_2/build.gradle rename to chapter_5/lecture_2_cyclic_barrier/build.gradle diff --git a/chapter_5/lecture_2/gradle/wrapper/gradle-wrapper.jar b/chapter_5/lecture_2_cyclic_barrier/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from chapter_5/lecture_2/gradle/wrapper/gradle-wrapper.jar rename to chapter_5/lecture_2_cyclic_barrier/gradle/wrapper/gradle-wrapper.jar diff --git a/chapter_5/lecture_2/gradle/wrapper/gradle-wrapper.properties b/chapter_5/lecture_2_cyclic_barrier/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from chapter_5/lecture_2/gradle/wrapper/gradle-wrapper.properties rename to chapter_5/lecture_2_cyclic_barrier/gradle/wrapper/gradle-wrapper.properties diff --git a/chapter_5/lecture_2/gradlew b/chapter_5/lecture_2_cyclic_barrier/gradlew similarity index 100% rename from chapter_5/lecture_2/gradlew rename to chapter_5/lecture_2_cyclic_barrier/gradlew diff --git a/chapter_5/lecture_2/gradlew.bat b/chapter_5/lecture_2_cyclic_barrier/gradlew.bat similarity index 100% rename from chapter_5/lecture_2/gradlew.bat rename to chapter_5/lecture_2_cyclic_barrier/gradlew.bat diff --git a/chapter_5/lecture_2/settings.gradle b/chapter_5/lecture_2_cyclic_barrier/settings.gradle similarity index 100% rename from chapter_5/lecture_2/settings.gradle rename to chapter_5/lecture_2_cyclic_barrier/settings.gradle diff --git a/chapter_5/lecture_2/src/main/java/Main.java b/chapter_5/lecture_2_cyclic_barrier/src/main/java/Main.java similarity index 67% rename from chapter_5/lecture_2/src/main/java/Main.java rename to chapter_5/lecture_2_cyclic_barrier/src/main/java/Main.java index ee1743e..5293277 100644 --- a/chapter_5/lecture_2/src/main/java/Main.java +++ b/chapter_5/lecture_2_cyclic_barrier/src/main/java/Main.java @@ -1,3 +1,4 @@ +import java.lang.reflect.Array; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -5,7 +6,14 @@ import java.util.concurrent.CyclicBarrier; public class Main { - +// public static void main(String[] args) throws InterruptedException, BrokenBarrierException { +// // barrier can be reused by new set of threads +// // parties - # of threads to wait for barrier +// // (optional) runnable to execute once all threads reached barrier, usually for clean up or initialization before threads proceed +// CyclicBarrier cyclicBarrier = new CyclicBarrier(4, () -> System.out.println("The barrier was released!")); +// +// cyclicBarrier.await(); // waits until required amount of threads have invoked await then they will be released +// } private static int[][] array = { {1, 2, 3, 1}, {2, 1, 2, 1}, @@ -36,16 +44,17 @@ public static void main(String[] args) throws InterruptedException { } System.out.println("The final array: " + Arrays.deepToString(array)); + System.out.println("Expected and Final Array are the same: " + (Arrays.deepToString(array).equals(Arrays.deepToString(outputArray)))); } static class WorkerThread implements Runnable { - private final int columnId; public WorkerThread(int columnId) { this.columnId = columnId; } + @Override public void run() { for (int i = 1; i < 4; i++) { @@ -60,7 +69,7 @@ public void run() { try { cyclicBarrier.await(); } catch (InterruptedException | BrokenBarrierException e) { - e.printStackTrace(); + throw new RuntimeException(e); } } } From c5418c7ae6c2f8cb518a3aa756156723ff1cb327 Mon Sep 17 00:00:00 2001 From: jeanfern5 Date: Sun, 12 May 2024 16:13:19 -0700 Subject: [PATCH 23/40] Completed --- chapter_5/lecture_3/src/main/java/Main.java | 48 --------------- .../build.gradle | 0 .../gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 .../{lecture_3 => lecture_3_phaser}/gradlew | 0 .../gradlew.bat | 0 .../settings.gradle | 0 .../lecture_3_phaser/src/main/java/Main.java | 56 ++++++++++++++++++ 8 files changed, 56 insertions(+), 48 deletions(-) delete mode 100644 chapter_5/lecture_3/src/main/java/Main.java rename chapter_5/{lecture_3 => lecture_3_phaser}/build.gradle (100%) rename chapter_5/{lecture_3 => lecture_3_phaser}/gradle/wrapper/gradle-wrapper.jar (100%) rename chapter_5/{lecture_3 => lecture_3_phaser}/gradle/wrapper/gradle-wrapper.properties (100%) rename chapter_5/{lecture_3 => lecture_3_phaser}/gradlew (100%) rename chapter_5/{lecture_3 => lecture_3_phaser}/gradlew.bat (100%) rename chapter_5/{lecture_3 => lecture_3_phaser}/settings.gradle (100%) create mode 100644 chapter_5/lecture_3_phaser/src/main/java/Main.java diff --git a/chapter_5/lecture_3/src/main/java/Main.java b/chapter_5/lecture_3/src/main/java/Main.java deleted file mode 100644 index b032f71..0000000 --- a/chapter_5/lecture_3/src/main/java/Main.java +++ /dev/null @@ -1,48 +0,0 @@ -import java.util.concurrent.Phaser; - -public class Main { - - private static int S = 0; - private static int[] array = new int[] {1, 2, 3, 4, 5, 6, 7, 8}; - - private static Phaser phaser = new Phaser(1); - - public static void main(String[] args) { - for (int i = 0; i < array.length; i++) { - Thread t = new Thread(new WorkerThread(i)); - t.start(); - } - - phaser.arriveAndAwaitAdvance(); - phaser.arriveAndAwaitAdvance(); - - System.out.println("The sum is: " + S); - System.out.println("Phase count: " + phaser.getPhase()); - - } - - static class WorkerThread implements Runnable { - - private final int threadIndex; - - public WorkerThread(int threadIndex) { - this.threadIndex = threadIndex; - phaser.register(); - } - - @Override - public void run() { - array[threadIndex] = array[threadIndex] * 2; - phaser.arriveAndAwaitAdvance(); - - if (threadIndex == 0) { - for (int j : array) { - S = S + j; - } - phaser.arriveAndAwaitAdvance(); - } else { - phaser.arriveAndDeregister(); - } - } - } -} \ No newline at end of file diff --git a/chapter_5/lecture_3/build.gradle b/chapter_5/lecture_3_phaser/build.gradle similarity index 100% rename from chapter_5/lecture_3/build.gradle rename to chapter_5/lecture_3_phaser/build.gradle diff --git a/chapter_5/lecture_3/gradle/wrapper/gradle-wrapper.jar b/chapter_5/lecture_3_phaser/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from chapter_5/lecture_3/gradle/wrapper/gradle-wrapper.jar rename to chapter_5/lecture_3_phaser/gradle/wrapper/gradle-wrapper.jar diff --git a/chapter_5/lecture_3/gradle/wrapper/gradle-wrapper.properties b/chapter_5/lecture_3_phaser/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from chapter_5/lecture_3/gradle/wrapper/gradle-wrapper.properties rename to chapter_5/lecture_3_phaser/gradle/wrapper/gradle-wrapper.properties diff --git a/chapter_5/lecture_3/gradlew b/chapter_5/lecture_3_phaser/gradlew similarity index 100% rename from chapter_5/lecture_3/gradlew rename to chapter_5/lecture_3_phaser/gradlew diff --git a/chapter_5/lecture_3/gradlew.bat b/chapter_5/lecture_3_phaser/gradlew.bat similarity index 100% rename from chapter_5/lecture_3/gradlew.bat rename to chapter_5/lecture_3_phaser/gradlew.bat diff --git a/chapter_5/lecture_3/settings.gradle b/chapter_5/lecture_3_phaser/settings.gradle similarity index 100% rename from chapter_5/lecture_3/settings.gradle rename to chapter_5/lecture_3_phaser/settings.gradle diff --git a/chapter_5/lecture_3_phaser/src/main/java/Main.java b/chapter_5/lecture_3_phaser/src/main/java/Main.java new file mode 100644 index 0000000..ebbc4c7 --- /dev/null +++ b/chapter_5/lecture_3_phaser/src/main/java/Main.java @@ -0,0 +1,56 @@ +import java.util.concurrent.Phaser; + +public class Main { +// public static void main(String[] args) { +// // similar to cyclic barrier but more flexible +// Phaser phaser = new Phaser(3); +// +// phaser.register(); // threads can register themselves and increase counter +// phaser.arriveAndAwaitAdvance(); // similar to cyclic barrier "await()" +// phaser.getPhase(); // gets internal counter +// phaser.awaitAdvance(3); // takes phase ID to surpass that phase +// phaser.arriveAndDeregister(); // non-block and decrease counter +// } + + private static int S = 0; + private static final int[] array = new int[] {1, 2, 3, 4, 5, 6, 7, 8 }; + + private static final Phaser phaser = new Phaser(1); // 1 to account for the main thread + public static void main(String[] args) { + for (int i = 0; i < array.length; i++) { + new Thread(new WorkerThread(i)).start(); + } + + phaser.arriveAndAwaitAdvance(); // main thread + phaser.arriveAndAwaitAdvance(); // need to wait remainder thread from the custom threads + + System.out.println("The sum is: " + S); + System.out.println("Phase count: " + phaser.getPhase()); + } + + static class WorkerThread implements Runnable { + + private final int threadIndex; + + public WorkerThread(int threadIndex) { + this.threadIndex = threadIndex; + phaser.register(); + } + + @Override + public void run() { + array[threadIndex] = array[threadIndex] * 2; // double values in-place + phaser.arriveAndAwaitAdvance(); // threads wait here until all 8 have arrived here, once all here to next phase + + System.out.println("===> threadIndex: " + threadIndex); + if (threadIndex == 0) {// 1 thread reaches here while the rest deregister + for (int i : array) { + S = S + i; // sum doubled values + } + phaser.arriveAndAwaitAdvance(); // 1 thread + } else { + phaser.arriveAndDeregister(); + } + } + } +} \ No newline at end of file From 3d9ddf286bfe2bb7daefc415d2465b210ea613b5 Mon Sep 17 00:00:00 2001 From: jeanfern5 Date: Sun, 12 May 2024 16:29:31 -0700 Subject: [PATCH 24/40] Completed --- chapter_5/lecture_4/src/main/java/Main.java | 21 ----------- .../build.gradle | 0 .../gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 .../gradlew | 0 .../gradlew.bat | 0 .../settings.gradle | 0 .../src/main/java/Main.java | 33 ++++++++++++++++++ 8 files changed, 33 insertions(+), 21 deletions(-) delete mode 100644 chapter_5/lecture_4/src/main/java/Main.java rename chapter_5/{lecture_4 => lecture_4_exchanger}/build.gradle (100%) rename chapter_5/{lecture_4 => lecture_4_exchanger}/gradle/wrapper/gradle-wrapper.jar (100%) rename chapter_5/{lecture_4 => lecture_4_exchanger}/gradle/wrapper/gradle-wrapper.properties (100%) rename chapter_5/{lecture_4 => lecture_4_exchanger}/gradlew (100%) rename chapter_5/{lecture_4 => lecture_4_exchanger}/gradlew.bat (100%) rename chapter_5/{lecture_4 => lecture_4_exchanger}/settings.gradle (100%) create mode 100644 chapter_5/lecture_4_exchanger/src/main/java/Main.java diff --git a/chapter_5/lecture_4/src/main/java/Main.java b/chapter_5/lecture_4/src/main/java/Main.java deleted file mode 100644 index 369b61e..0000000 --- a/chapter_5/lecture_4/src/main/java/Main.java +++ /dev/null @@ -1,21 +0,0 @@ -import java.util.concurrent.Exchanger; - -public class Main { - public static void main(String[] args) throws InterruptedException { - Exchanger exchanger = new Exchanger<>(); - - Thread t = new Thread(() -> { - try { - String receivedValue = exchanger.exchange("value1"); - System.out.println("Received: " + receivedValue + " in thread " + Thread.currentThread().getName()); - } catch (InterruptedException e) { - e.printStackTrace(); - } - }); - - t.start(); - - String receivedValue = exchanger.exchange("value2"); - System.out.println("Received: " + receivedValue + " in thread " + Thread.currentThread().getName()); - } -} diff --git a/chapter_5/lecture_4/build.gradle b/chapter_5/lecture_4_exchanger/build.gradle similarity index 100% rename from chapter_5/lecture_4/build.gradle rename to chapter_5/lecture_4_exchanger/build.gradle diff --git a/chapter_5/lecture_4/gradle/wrapper/gradle-wrapper.jar b/chapter_5/lecture_4_exchanger/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from chapter_5/lecture_4/gradle/wrapper/gradle-wrapper.jar rename to chapter_5/lecture_4_exchanger/gradle/wrapper/gradle-wrapper.jar diff --git a/chapter_5/lecture_4/gradle/wrapper/gradle-wrapper.properties b/chapter_5/lecture_4_exchanger/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from chapter_5/lecture_4/gradle/wrapper/gradle-wrapper.properties rename to chapter_5/lecture_4_exchanger/gradle/wrapper/gradle-wrapper.properties diff --git a/chapter_5/lecture_4/gradlew b/chapter_5/lecture_4_exchanger/gradlew similarity index 100% rename from chapter_5/lecture_4/gradlew rename to chapter_5/lecture_4_exchanger/gradlew diff --git a/chapter_5/lecture_4/gradlew.bat b/chapter_5/lecture_4_exchanger/gradlew.bat similarity index 100% rename from chapter_5/lecture_4/gradlew.bat rename to chapter_5/lecture_4_exchanger/gradlew.bat diff --git a/chapter_5/lecture_4/settings.gradle b/chapter_5/lecture_4_exchanger/settings.gradle similarity index 100% rename from chapter_5/lecture_4/settings.gradle rename to chapter_5/lecture_4_exchanger/settings.gradle diff --git a/chapter_5/lecture_4_exchanger/src/main/java/Main.java b/chapter_5/lecture_4_exchanger/src/main/java/Main.java new file mode 100644 index 0000000..e820981 --- /dev/null +++ b/chapter_5/lecture_4_exchanger/src/main/java/Main.java @@ -0,0 +1,33 @@ +import java.util.concurrent.Exchanger; + +public class Main { +// public static void main(String[] args) throws InterruptedException { +// // allows a pair of threads to exchange information - uneven pairs will be "stuck" and never execute +// Exchanger exchanger = new Exchanger<>(); +// +// // Thread 1 +// String receivedType1 = exchanger.exchange("value1"); +// +// // Thread 2 +// String receivedType2 = exchanger.exchange("value2"); +// } + + public static void main(String[] args) throws InterruptedException { + Exchanger exchanger = new Exchanger<>(); + + for (int i = 0; i < 3; i++) { + new Thread(() -> { + try { + String threadName = Thread.currentThread().getName(); + String receivedValue = exchanger.exchange("value_from_" + threadName); + System.out.println("Received: " + receivedValue + " in thread " + threadName); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + }).start(); + } + + String receivedValue = exchanger.exchange("value_from_main"); // main thread + System.out.println("Received: " + receivedValue + " in thread " + Thread.currentThread().getName()); + } +} From 08089db4f307e98809e70f708d7e45085dcc1068 Mon Sep 17 00:00:00 2001 From: jeanfern5 Date: Sun, 12 May 2024 17:07:17 -0700 Subject: [PATCH 25/40] Completed --- chapter_5/lecture_5/src/main/java/Main.java | 35 -------------- .../build.gradle | 0 .../gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 .../gradlew | 0 .../gradlew.bat | 0 .../settings.gradle | 0 .../src/main/java/Main.java | 44 ++++++++++++++++++ 8 files changed, 44 insertions(+), 35 deletions(-) delete mode 100644 chapter_5/lecture_5/src/main/java/Main.java rename chapter_5/{lecture_5 => lecture_5_deadlocks_and_livelocks}/build.gradle (100%) rename chapter_5/{lecture_5 => lecture_5_deadlocks_and_livelocks}/gradle/wrapper/gradle-wrapper.jar (100%) rename chapter_5/{lecture_5 => lecture_5_deadlocks_and_livelocks}/gradle/wrapper/gradle-wrapper.properties (100%) rename chapter_5/{lecture_5 => lecture_5_deadlocks_and_livelocks}/gradlew (100%) rename chapter_5/{lecture_5 => lecture_5_deadlocks_and_livelocks}/gradlew.bat (100%) rename chapter_5/{lecture_5 => lecture_5_deadlocks_and_livelocks}/settings.gradle (100%) create mode 100644 chapter_5/lecture_5_deadlocks_and_livelocks/src/main/java/Main.java diff --git a/chapter_5/lecture_5/src/main/java/Main.java b/chapter_5/lecture_5/src/main/java/Main.java deleted file mode 100644 index 0b58631..0000000 --- a/chapter_5/lecture_5/src/main/java/Main.java +++ /dev/null @@ -1,35 +0,0 @@ -import java.util.concurrent.locks.Lock; -import java.util.concurrent.locks.ReentrantLock; - -public class Main { - - private static Lock lock1 = new ReentrantLock(); - private static Lock lock2 = new ReentrantLock(); - - public static void main(String[] args) { - Thread t1 = new Thread(() -> { - lock2.tryLock(); - System.out.println("Thread 1 acquired lock2"); - - lock1.lock(); - System.out.println("Thread 1 acquired lock1"); - lock1.unlock(); - - lock2.unlock(); - }); - - Thread t2 = new Thread(() -> { - lock2.lock(); - System.out.println("Thread 2 acquired lock2"); - - lock1.lock(); - System.out.println("Thread 2 acquired lock1"); - lock1.unlock(); - - lock2.unlock(); - }); - - t1.start(); - t2.start(); - } -} diff --git a/chapter_5/lecture_5/build.gradle b/chapter_5/lecture_5_deadlocks_and_livelocks/build.gradle similarity index 100% rename from chapter_5/lecture_5/build.gradle rename to chapter_5/lecture_5_deadlocks_and_livelocks/build.gradle diff --git a/chapter_5/lecture_5/gradle/wrapper/gradle-wrapper.jar b/chapter_5/lecture_5_deadlocks_and_livelocks/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from chapter_5/lecture_5/gradle/wrapper/gradle-wrapper.jar rename to chapter_5/lecture_5_deadlocks_and_livelocks/gradle/wrapper/gradle-wrapper.jar diff --git a/chapter_5/lecture_5/gradle/wrapper/gradle-wrapper.properties b/chapter_5/lecture_5_deadlocks_and_livelocks/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from chapter_5/lecture_5/gradle/wrapper/gradle-wrapper.properties rename to chapter_5/lecture_5_deadlocks_and_livelocks/gradle/wrapper/gradle-wrapper.properties diff --git a/chapter_5/lecture_5/gradlew b/chapter_5/lecture_5_deadlocks_and_livelocks/gradlew similarity index 100% rename from chapter_5/lecture_5/gradlew rename to chapter_5/lecture_5_deadlocks_and_livelocks/gradlew diff --git a/chapter_5/lecture_5/gradlew.bat b/chapter_5/lecture_5_deadlocks_and_livelocks/gradlew.bat similarity index 100% rename from chapter_5/lecture_5/gradlew.bat rename to chapter_5/lecture_5_deadlocks_and_livelocks/gradlew.bat diff --git a/chapter_5/lecture_5/settings.gradle b/chapter_5/lecture_5_deadlocks_and_livelocks/settings.gradle similarity index 100% rename from chapter_5/lecture_5/settings.gradle rename to chapter_5/lecture_5_deadlocks_and_livelocks/settings.gradle diff --git a/chapter_5/lecture_5_deadlocks_and_livelocks/src/main/java/Main.java b/chapter_5/lecture_5_deadlocks_and_livelocks/src/main/java/Main.java new file mode 100644 index 0000000..3e84ec8 --- /dev/null +++ b/chapter_5/lecture_5_deadlocks_and_livelocks/src/main/java/Main.java @@ -0,0 +1,44 @@ +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; + +public class Main { +// public static void main(String[] args) throws InterruptedException { +// Thread.currentThread().join(); // will not exit (ie deadlock) - best to use join w/ timeout +// } + private static Lock lock1 = new ReentrantLock(); + private static Lock lock2 = new ReentrantLock(); + + public static void main(String[] args) throws InterruptedException { + // acquires lock1, but lock2 is taken by thread 2 + Thread t1 = new Thread(() -> { + lock1.lock(); // tryLock() w/ specific timeout to interrupt deadlocks + System.out.println("Thread 1 acquired lock1"); + + lock2.lock(); + System.out.println("Thread 1 acquired lock2"); + lock2.unlock(); + + lock1.unlock(); + }); + + // acquires lock2, but lock1 is taken by thread 1 -> leads to deadlock since both threads are waiting for each other to release resources which keeps thread live and "stuck" + // `deadlocks` threads are blocked due to circular dependency + // can try to avoid with timeouts and process terminations + // if locks were set exactly as above -> no deadlock would be encountered + // `livelocks` threads are not able to make progress (not blocked) because they respond to each other but don't complete a task + // harder to detect because threads are active and consuming CPU resources + Thread t2 = new Thread(() -> { + lock2.lock(); + System.out.println("Thread 2 acquired lock2"); + + lock1.lock(); + System.out.println("Thread 2 acquired lock1"); + lock1.unlock(); + + lock2.unlock(); + }); + + t1.start(); + t2.start(); + } +} From e9fbf7d8862ecf060c16ea745d17650b5377fb12 Mon Sep 17 00:00:00 2001 From: jeanfern5 Date: Sun, 19 May 2024 16:11:57 -0700 Subject: [PATCH 26/40] Completed --- chapter_5/lecture_6/src/main/java/Main.java | 35 ------------- .../build.gradle | 0 .../gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 .../{lecture_6 => lecture_6_volatile}/gradlew | 0 .../gradlew.bat | 0 .../settings.gradle | 0 .../src/main/java/Main.java | 46 ++++++++++++++++++ 8 files changed, 46 insertions(+), 35 deletions(-) delete mode 100644 chapter_5/lecture_6/src/main/java/Main.java rename chapter_5/{lecture_6 => lecture_6_volatile}/build.gradle (100%) rename chapter_5/{lecture_6 => lecture_6_volatile}/gradle/wrapper/gradle-wrapper.jar (100%) rename chapter_5/{lecture_6 => lecture_6_volatile}/gradle/wrapper/gradle-wrapper.properties (100%) rename chapter_5/{lecture_6 => lecture_6_volatile}/gradlew (100%) rename chapter_5/{lecture_6 => lecture_6_volatile}/gradlew.bat (100%) rename chapter_5/{lecture_6 => lecture_6_volatile}/settings.gradle (100%) create mode 100644 chapter_5/lecture_6_volatile/src/main/java/Main.java diff --git a/chapter_5/lecture_6/src/main/java/Main.java b/chapter_5/lecture_6/src/main/java/Main.java deleted file mode 100644 index c0afb98..0000000 --- a/chapter_5/lecture_6/src/main/java/Main.java +++ /dev/null @@ -1,35 +0,0 @@ -public class Main { - - private static volatile int counter = 0; - - public static void main(String[] args) { - Thread t1 = new Thread(() -> { - int local_counter = counter; - - while (local_counter < 10) { - if (local_counter != counter) { - System.out.println("[T1] Local counter is changed "); - local_counter = counter; - } - } - }); - - Thread t2 = new Thread(() -> { - int local_counter = counter; - - while (local_counter < 10) { - System.out.println("[T2] Incremented counter to " + (local_counter + 1)); - counter = ++local_counter; - - try { - Thread.sleep(500); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - }); - - t1.start(); - t2.start(); - } -} diff --git a/chapter_5/lecture_6/build.gradle b/chapter_5/lecture_6_volatile/build.gradle similarity index 100% rename from chapter_5/lecture_6/build.gradle rename to chapter_5/lecture_6_volatile/build.gradle diff --git a/chapter_5/lecture_6/gradle/wrapper/gradle-wrapper.jar b/chapter_5/lecture_6_volatile/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from chapter_5/lecture_6/gradle/wrapper/gradle-wrapper.jar rename to chapter_5/lecture_6_volatile/gradle/wrapper/gradle-wrapper.jar diff --git a/chapter_5/lecture_6/gradle/wrapper/gradle-wrapper.properties b/chapter_5/lecture_6_volatile/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from chapter_5/lecture_6/gradle/wrapper/gradle-wrapper.properties rename to chapter_5/lecture_6_volatile/gradle/wrapper/gradle-wrapper.properties diff --git a/chapter_5/lecture_6/gradlew b/chapter_5/lecture_6_volatile/gradlew similarity index 100% rename from chapter_5/lecture_6/gradlew rename to chapter_5/lecture_6_volatile/gradlew diff --git a/chapter_5/lecture_6/gradlew.bat b/chapter_5/lecture_6_volatile/gradlew.bat similarity index 100% rename from chapter_5/lecture_6/gradlew.bat rename to chapter_5/lecture_6_volatile/gradlew.bat diff --git a/chapter_5/lecture_6/settings.gradle b/chapter_5/lecture_6_volatile/settings.gradle similarity index 100% rename from chapter_5/lecture_6/settings.gradle rename to chapter_5/lecture_6_volatile/settings.gradle diff --git a/chapter_5/lecture_6_volatile/src/main/java/Main.java b/chapter_5/lecture_6_volatile/src/main/java/Main.java new file mode 100644 index 0000000..0624922 --- /dev/null +++ b/chapter_5/lecture_6_volatile/src/main/java/Main.java @@ -0,0 +1,46 @@ +public class Main { + /** + * There is a delay between cache to update in main memory so in this scenario where + * private static int counter = 0; + * Thread1 will not see the update `counter` value and will get stuck in an infinity loop + * due to T1.localCounter never updating to what's in the main memory (RAM). + */ +// private static int counter = 0; + /** + * "volatile" keyword read's directly from the shared variable in the main memory + * to avoid stale data from the cached value + * Trade off: Increases consistency but decreases performance because cache look up is quicker + * than the main memory (RAM) + */ + private static volatile int counter = 0; + public static void main(String[] args) { + Thread t1 = new Thread(() -> { + int localCounter = counter; + + while (localCounter < 10) { + if (localCounter != counter) { + System.out.println("[T1] Local counter is changed " + localCounter); + localCounter = counter; + } + } + }); + + Thread t2 = new Thread(() -> { + int localCounter = counter; + + while (localCounter < 10) { + System.out.println("[T2] Incremented local counter to " + (localCounter + 1)); + counter = ++localCounter; + + try { + Thread.sleep(500); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + }); + + t1.start(); + t2.start(); + } +} From 23ed5aa6fdda62bb19f74597ac624f9eeee708a8 Mon Sep 17 00:00:00 2001 From: jeanfern5 Date: Sun, 19 May 2024 16:46:59 -0700 Subject: [PATCH 27/40] improve project chapter_3_thread_management/lecture_7_project_parallel_text_file_processing using "volatile" keyword --- .../src/main/java/Main.java | 25 +++++++++++++++---- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/chapter_3_thread_management/lecture_7_project_parallel_text_file_processing/src/main/java/Main.java b/chapter_3_thread_management/lecture_7_project_parallel_text_file_processing/src/main/java/Main.java index 102a1ed..401bce2 100644 --- a/chapter_3_thread_management/lecture_7_project_parallel_text_file_processing/src/main/java/Main.java +++ b/chapter_3_thread_management/lecture_7_project_parallel_text_file_processing/src/main/java/Main.java @@ -26,7 +26,14 @@ public class Main { // 1. increase sleep timer - will give process more time to add file to map before new thread starts (reduce re-runs of the same file) // 2. add file to map before completing the process - risk file has an error and marked as "successful" when in fact it failed (file misses) // 3. add a "pending" state where it shows the file is in progress so that the new thread doesn't work on processing the file <---- best choice - static Map> processedFiles = new HashMap<>(); // Not a perfect solution due to race conditions + +// static Map> processedFiles = new HashMap<>(); // Not a perfect solution due to race conditions + + // improved: adding "volatile" keyword seems to have helped with race condition issue where the same file was being + // processed more than once - tried about 20 times + // this is due to the shared variable been up-to-date since it's getting the value from the main memory instead + // of the thread's cache which can be stale since there's a delay between the main memory and cache being synced + static volatile Map> processedFiles = new HashMap<>(); public static void main(String[] args) { new Thread(new Watcher(processedFiles)).start(); @@ -77,9 +84,17 @@ public void run() { boolean fileIsNotInSuccessful = !processedFiles.get(SUCCESSFUL).contains(file.getName()); boolean fileIsNotInPending = !processedFiles.get(PENDING).contains(file.getName()); if (fileIsNotInSuccessful && fileIsNotInPending) { - // Thread t = new Thread(new FileProcessor(file, processedFiles)); // leads to race condition as opposed to variable reference - FileProcessor proc = new FileProcessor(file, processedFiles); - Thread t = new Thread(proc); + /** When "volatile" wasn't used for processedFiles there was a weird situation where + * ```Thread t = new Thread(new FileProcessor(file, processedFiles));``` + * leads to a race condition compared to variable reference when tried over 20 times each + * ```FileProcessor proc = new FileProcessor(file, processedFiles); + * Thread t = new Thread(proc);``` + * I would have expected both method to have the same behaviour but doesn't seem to be the case + * I wonder if the variable reference slows down the thread enough to + * 1. give Thread1 enough time to update the map and Thread2 to read that file is "pending" OR + * 2. read from the `processedFiles` map where the cached variable has been synced with the main memory + */ + Thread t = new Thread(new FileProcessor(file, processedFiles)); t.setUncaughtExceptionHandler(new ExceptionHandler(processedFiles, file)); t.start(); } @@ -93,7 +108,7 @@ public void run() { private void sleep() { try { - Thread.sleep(10000); + Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } From 480913e2d93915a2d5f4bce1399a2923d97f412d Mon Sep 17 00:00:00 2001 From: jeanfern5 Date: Sun, 19 May 2024 16:55:03 -0700 Subject: [PATCH 28/40] improve project chapter_3_thread_management/lecture_7_project_parallel_text_file_processing using "volatile" keyword --- .../src/main/java/Main.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/chapter_3_thread_management/lecture_7_project_parallel_text_file_processing/src/main/java/Main.java b/chapter_3_thread_management/lecture_7_project_parallel_text_file_processing/src/main/java/Main.java index 401bce2..fb5e817 100644 --- a/chapter_3_thread_management/lecture_7_project_parallel_text_file_processing/src/main/java/Main.java +++ b/chapter_3_thread_management/lecture_7_project_parallel_text_file_processing/src/main/java/Main.java @@ -29,10 +29,14 @@ public class Main { // static Map> processedFiles = new HashMap<>(); // Not a perfect solution due to race conditions - // improved: adding "volatile" keyword seems to have helped with race condition issue where the same file was being - // processed more than once - tried about 20 times - // this is due to the shared variable been up-to-date since it's getting the value from the main memory instead - // of the thread's cache which can be stale since there's a delay between the main memory and cache being synced + /** + * improved but not perfect: adding "volatile" keyword seems to have helped with race condition issue where the same file was being + * processed more than once - tried about 20 times + * this is due to the shared variable been up-to-date since it's getting the value from the main memory instead + * of the thread's cache which can be stale since there's a delay between the main memory and cache being synced + * + * This can still lead to a race condition but for this specific setup it doesn't since it's basic enough + * */ static volatile Map> processedFiles = new HashMap<>(); public static void main(String[] args) { From 8e3abac3439468513d623b470eed1b5eab1dc5db Mon Sep 17 00:00:00 2001 From: jeanfern5 Date: Sun, 19 May 2024 18:02:44 -0700 Subject: [PATCH 29/40] Completed project --- .../build.gradle | 0 .../gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 .../gradlew | 0 .../gradlew.bat | 0 .../settings.gradle | 0 .../src/main/java/Main.java | 42 +++++++++--------- 7 files changed, 21 insertions(+), 21 deletions(-) rename chapter_5/{project => project_simulating_mapreduce_with_threads}/build.gradle (100%) rename chapter_5/{project => project_simulating_mapreduce_with_threads}/gradle/wrapper/gradle-wrapper.jar (100%) rename chapter_5/{project => project_simulating_mapreduce_with_threads}/gradle/wrapper/gradle-wrapper.properties (100%) rename chapter_5/{project => project_simulating_mapreduce_with_threads}/gradlew (100%) rename chapter_5/{project => project_simulating_mapreduce_with_threads}/gradlew.bat (100%) rename chapter_5/{project => project_simulating_mapreduce_with_threads}/settings.gradle (100%) rename chapter_5/{project => project_simulating_mapreduce_with_threads}/src/main/java/Main.java (67%) diff --git a/chapter_5/project/build.gradle b/chapter_5/project_simulating_mapreduce_with_threads/build.gradle similarity index 100% rename from chapter_5/project/build.gradle rename to chapter_5/project_simulating_mapreduce_with_threads/build.gradle diff --git a/chapter_5/project/gradle/wrapper/gradle-wrapper.jar b/chapter_5/project_simulating_mapreduce_with_threads/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from chapter_5/project/gradle/wrapper/gradle-wrapper.jar rename to chapter_5/project_simulating_mapreduce_with_threads/gradle/wrapper/gradle-wrapper.jar diff --git a/chapter_5/project/gradle/wrapper/gradle-wrapper.properties b/chapter_5/project_simulating_mapreduce_with_threads/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from chapter_5/project/gradle/wrapper/gradle-wrapper.properties rename to chapter_5/project_simulating_mapreduce_with_threads/gradle/wrapper/gradle-wrapper.properties diff --git a/chapter_5/project/gradlew b/chapter_5/project_simulating_mapreduce_with_threads/gradlew similarity index 100% rename from chapter_5/project/gradlew rename to chapter_5/project_simulating_mapreduce_with_threads/gradlew diff --git a/chapter_5/project/gradlew.bat b/chapter_5/project_simulating_mapreduce_with_threads/gradlew.bat similarity index 100% rename from chapter_5/project/gradlew.bat rename to chapter_5/project_simulating_mapreduce_with_threads/gradlew.bat diff --git a/chapter_5/project/settings.gradle b/chapter_5/project_simulating_mapreduce_with_threads/settings.gradle similarity index 100% rename from chapter_5/project/settings.gradle rename to chapter_5/project_simulating_mapreduce_with_threads/settings.gradle diff --git a/chapter_5/project/src/main/java/Main.java b/chapter_5/project_simulating_mapreduce_with_threads/src/main/java/Main.java similarity index 67% rename from chapter_5/project/src/main/java/Main.java rename to chapter_5/project_simulating_mapreduce_with_threads/src/main/java/Main.java index f749c5b..5cfa07d 100644 --- a/chapter_5/project/src/main/java/Main.java +++ b/chapter_5/project_simulating_mapreduce_with_threads/src/main/java/Main.java @@ -2,8 +2,10 @@ import java.util.concurrent.CountDownLatch; import java.util.stream.Collectors; +/** + * Simulating MapReduce with Threads + */ public class Main { - /* -> Intermediate result: @@ -30,36 +32,35 @@ public class Main { ], ... ] - - - */ - private static final String input = "a friend in need is a friend indeed"; - - private static final CountDownLatch countDownLatch = new CountDownLatch(2); - + private static final CountDownLatch countDownLatch = new CountDownLatch(2); // 2 counts == 2 Mapper threads private static final List> intermediateResult = Collections.synchronizedList(new ArrayList<>()); private static final List>> reducersInput = Collections.synchronizedList(new ArrayList<>()); public static void main(String[] args) throws InterruptedException { List inputList = Arrays.asList(input.split(" ")); - new Thread(new Mapper(inputList.subList(0, inputList.size() / 2))).start(); - new Thread(new Mapper(inputList.subList(inputList.size() / 2, inputList.size()))).start(); + // Map - map words in parallel between two threads and create "inputReducer" + int midListIdx = inputList.size() / 2; + new Thread(new Mapper(inputList.subList(0, midListIdx))).start(); + new Thread(new Mapper(inputList.subList(midListIdx, inputList.size()))).start(); + // Partition - filer unique words from inputReducer and re-order words group same words together Thread partitioner = new Thread(new Partitioner()); partitioner.start(); - partitioner.join(); + partitioner.join(); // makes sure the partitioner is complete before going to the Reducer - waits for the thread to die - for (List> reducerInput : reducersInput) { + // Reducer - count words in each group and print count of each word + for (List> reducerInput: reducersInput) { new Thread(new Reducer(reducerInput)).start(); } + +// System.out.println("Test"); // useful breakpoint to see values from `intermediateResult` and `reducersInput` } static class Mapper implements Runnable { private final List input; - public Mapper(List input) { this.input = input; } @@ -69,18 +70,19 @@ public void run() { for (String word : input) { intermediateResult.add(Map.entry(word, 1)); } + // guarantees that `Partitioner` thread won't start before `Mapper` threads are done countDownLatch.countDown(); } } static class Partitioner implements Runnable { - @Override public void run() { try { + // guarantees that `Partitioner` thread won't start before `Mapper` threads are done countDownLatch.await(); } catch (InterruptedException e) { - e.printStackTrace(); + throw new RuntimeException(e); } List uniqueWords = intermediateResult.stream() @@ -98,21 +100,19 @@ public void run() { } static class Reducer implements Runnable { - private final List> reducerInput; - public Reducer(List> reducerInput) { this.reducerInput = reducerInput; } @Override public void run() { - int S = 0; - for (Map.Entry entry: reducerInput) { - S += entry.getValue(); + int sum = 0; + for (Map.Entry entry : reducerInput) { + sum += entry.getValue(); } - System.out.println("The word: " + reducerInput.get(0).getKey() + " -> occurences: " + S); + System.out.println("The word: " + reducerInput.get(0).getKey() + " -> occurrences: " + sum); } } } From d26193fe8a39e46d40d7f480759ed9ee77c7bb6c Mon Sep 17 00:00:00 2001 From: jeanfern5 Date: Sun, 19 May 2024 18:06:18 -0700 Subject: [PATCH 30/40] Completed --- .../lecture_1_count_down_latch/build.gradle | 0 .../gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 .../lecture_1_count_down_latch/gradlew | 0 .../lecture_1_count_down_latch/gradlew.bat | 0 .../lecture_1_count_down_latch/settings.gradle | 0 .../src/main/java/Main.java | 0 .../lecture_2_cyclic_barrier/build.gradle | 0 .../gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 .../lecture_2_cyclic_barrier/gradlew | 0 .../lecture_2_cyclic_barrier/gradlew.bat | 0 .../lecture_2_cyclic_barrier/settings.gradle | 0 .../src/main/java/Main.java | 0 .../lecture_3_phaser/build.gradle | 0 .../gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 .../lecture_3_phaser/gradlew | 0 .../lecture_3_phaser/gradlew.bat | 0 .../lecture_3_phaser/settings.gradle | 0 .../lecture_3_phaser/src/main/java/Main.java | 0 .../lecture_4_exchanger/build.gradle | 0 .../gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 .../lecture_4_exchanger/gradlew | 0 .../lecture_4_exchanger/gradlew.bat | 0 .../lecture_4_exchanger/settings.gradle | 0 .../lecture_4_exchanger/src/main/java/Main.java | 0 .../lecture_5_deadlocks_and_livelocks/build.gradle | 0 .../gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 .../lecture_5_deadlocks_and_livelocks/gradlew | 0 .../lecture_5_deadlocks_and_livelocks/gradlew.bat | 0 .../settings.gradle | 0 .../src/main/java/Main.java | 0 .../lecture_6_volatile/build.gradle | 0 .../gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 .../lecture_6_volatile/gradlew | 0 .../lecture_6_volatile/gradlew.bat | 0 .../lecture_6_volatile/settings.gradle | 0 .../lecture_6_volatile/src/main/java/Main.java | 0 .../build.gradle | 0 .../gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 .../gradlew | 0 .../gradlew.bat | 0 .../settings.gradle | 0 .../src/main/java/Main.java | 0 49 files changed, 0 insertions(+), 0 deletions(-) rename {chapter_5 => chapter_5_thread_synchronization_part2}/lecture_1_count_down_latch/build.gradle (100%) rename {chapter_5 => chapter_5_thread_synchronization_part2}/lecture_1_count_down_latch/gradle/wrapper/gradle-wrapper.jar (100%) rename {chapter_5 => chapter_5_thread_synchronization_part2}/lecture_1_count_down_latch/gradle/wrapper/gradle-wrapper.properties (100%) rename {chapter_5 => chapter_5_thread_synchronization_part2}/lecture_1_count_down_latch/gradlew (100%) rename {chapter_5 => chapter_5_thread_synchronization_part2}/lecture_1_count_down_latch/gradlew.bat (100%) rename {chapter_5 => chapter_5_thread_synchronization_part2}/lecture_1_count_down_latch/settings.gradle (100%) rename {chapter_5 => chapter_5_thread_synchronization_part2}/lecture_1_count_down_latch/src/main/java/Main.java (100%) rename {chapter_5 => chapter_5_thread_synchronization_part2}/lecture_2_cyclic_barrier/build.gradle (100%) rename {chapter_5 => chapter_5_thread_synchronization_part2}/lecture_2_cyclic_barrier/gradle/wrapper/gradle-wrapper.jar (100%) rename {chapter_5 => chapter_5_thread_synchronization_part2}/lecture_2_cyclic_barrier/gradle/wrapper/gradle-wrapper.properties (100%) rename {chapter_5 => chapter_5_thread_synchronization_part2}/lecture_2_cyclic_barrier/gradlew (100%) rename {chapter_5 => chapter_5_thread_synchronization_part2}/lecture_2_cyclic_barrier/gradlew.bat (100%) rename {chapter_5 => chapter_5_thread_synchronization_part2}/lecture_2_cyclic_barrier/settings.gradle (100%) rename {chapter_5 => chapter_5_thread_synchronization_part2}/lecture_2_cyclic_barrier/src/main/java/Main.java (100%) rename {chapter_5 => chapter_5_thread_synchronization_part2}/lecture_3_phaser/build.gradle (100%) rename {chapter_5 => chapter_5_thread_synchronization_part2}/lecture_3_phaser/gradle/wrapper/gradle-wrapper.jar (100%) rename {chapter_5 => chapter_5_thread_synchronization_part2}/lecture_3_phaser/gradle/wrapper/gradle-wrapper.properties (100%) rename {chapter_5 => chapter_5_thread_synchronization_part2}/lecture_3_phaser/gradlew (100%) rename {chapter_5 => chapter_5_thread_synchronization_part2}/lecture_3_phaser/gradlew.bat (100%) rename {chapter_5 => chapter_5_thread_synchronization_part2}/lecture_3_phaser/settings.gradle (100%) rename {chapter_5 => chapter_5_thread_synchronization_part2}/lecture_3_phaser/src/main/java/Main.java (100%) rename {chapter_5 => chapter_5_thread_synchronization_part2}/lecture_4_exchanger/build.gradle (100%) rename {chapter_5 => chapter_5_thread_synchronization_part2}/lecture_4_exchanger/gradle/wrapper/gradle-wrapper.jar (100%) rename {chapter_5 => chapter_5_thread_synchronization_part2}/lecture_4_exchanger/gradle/wrapper/gradle-wrapper.properties (100%) rename {chapter_5 => chapter_5_thread_synchronization_part2}/lecture_4_exchanger/gradlew (100%) rename {chapter_5 => chapter_5_thread_synchronization_part2}/lecture_4_exchanger/gradlew.bat (100%) rename {chapter_5 => chapter_5_thread_synchronization_part2}/lecture_4_exchanger/settings.gradle (100%) rename {chapter_5 => chapter_5_thread_synchronization_part2}/lecture_4_exchanger/src/main/java/Main.java (100%) rename {chapter_5 => chapter_5_thread_synchronization_part2}/lecture_5_deadlocks_and_livelocks/build.gradle (100%) rename {chapter_5 => chapter_5_thread_synchronization_part2}/lecture_5_deadlocks_and_livelocks/gradle/wrapper/gradle-wrapper.jar (100%) rename {chapter_5 => chapter_5_thread_synchronization_part2}/lecture_5_deadlocks_and_livelocks/gradle/wrapper/gradle-wrapper.properties (100%) rename {chapter_5 => chapter_5_thread_synchronization_part2}/lecture_5_deadlocks_and_livelocks/gradlew (100%) rename {chapter_5 => chapter_5_thread_synchronization_part2}/lecture_5_deadlocks_and_livelocks/gradlew.bat (100%) rename {chapter_5 => chapter_5_thread_synchronization_part2}/lecture_5_deadlocks_and_livelocks/settings.gradle (100%) rename {chapter_5 => chapter_5_thread_synchronization_part2}/lecture_5_deadlocks_and_livelocks/src/main/java/Main.java (100%) rename {chapter_5 => chapter_5_thread_synchronization_part2}/lecture_6_volatile/build.gradle (100%) rename {chapter_5 => chapter_5_thread_synchronization_part2}/lecture_6_volatile/gradle/wrapper/gradle-wrapper.jar (100%) rename {chapter_5 => chapter_5_thread_synchronization_part2}/lecture_6_volatile/gradle/wrapper/gradle-wrapper.properties (100%) rename {chapter_5 => chapter_5_thread_synchronization_part2}/lecture_6_volatile/gradlew (100%) rename {chapter_5 => chapter_5_thread_synchronization_part2}/lecture_6_volatile/gradlew.bat (100%) rename {chapter_5 => chapter_5_thread_synchronization_part2}/lecture_6_volatile/settings.gradle (100%) rename {chapter_5 => chapter_5_thread_synchronization_part2}/lecture_6_volatile/src/main/java/Main.java (100%) rename {chapter_5 => chapter_5_thread_synchronization_part2}/project_simulating_mapreduce_with_threads/build.gradle (100%) rename {chapter_5 => chapter_5_thread_synchronization_part2}/project_simulating_mapreduce_with_threads/gradle/wrapper/gradle-wrapper.jar (100%) rename {chapter_5 => chapter_5_thread_synchronization_part2}/project_simulating_mapreduce_with_threads/gradle/wrapper/gradle-wrapper.properties (100%) rename {chapter_5 => chapter_5_thread_synchronization_part2}/project_simulating_mapreduce_with_threads/gradlew (100%) rename {chapter_5 => chapter_5_thread_synchronization_part2}/project_simulating_mapreduce_with_threads/gradlew.bat (100%) rename {chapter_5 => chapter_5_thread_synchronization_part2}/project_simulating_mapreduce_with_threads/settings.gradle (100%) rename {chapter_5 => chapter_5_thread_synchronization_part2}/project_simulating_mapreduce_with_threads/src/main/java/Main.java (100%) diff --git a/chapter_5/lecture_1_count_down_latch/build.gradle b/chapter_5_thread_synchronization_part2/lecture_1_count_down_latch/build.gradle similarity index 100% rename from chapter_5/lecture_1_count_down_latch/build.gradle rename to chapter_5_thread_synchronization_part2/lecture_1_count_down_latch/build.gradle diff --git a/chapter_5/lecture_1_count_down_latch/gradle/wrapper/gradle-wrapper.jar b/chapter_5_thread_synchronization_part2/lecture_1_count_down_latch/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from chapter_5/lecture_1_count_down_latch/gradle/wrapper/gradle-wrapper.jar rename to chapter_5_thread_synchronization_part2/lecture_1_count_down_latch/gradle/wrapper/gradle-wrapper.jar diff --git a/chapter_5/lecture_1_count_down_latch/gradle/wrapper/gradle-wrapper.properties b/chapter_5_thread_synchronization_part2/lecture_1_count_down_latch/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from chapter_5/lecture_1_count_down_latch/gradle/wrapper/gradle-wrapper.properties rename to chapter_5_thread_synchronization_part2/lecture_1_count_down_latch/gradle/wrapper/gradle-wrapper.properties diff --git a/chapter_5/lecture_1_count_down_latch/gradlew b/chapter_5_thread_synchronization_part2/lecture_1_count_down_latch/gradlew similarity index 100% rename from chapter_5/lecture_1_count_down_latch/gradlew rename to chapter_5_thread_synchronization_part2/lecture_1_count_down_latch/gradlew diff --git a/chapter_5/lecture_1_count_down_latch/gradlew.bat b/chapter_5_thread_synchronization_part2/lecture_1_count_down_latch/gradlew.bat similarity index 100% rename from chapter_5/lecture_1_count_down_latch/gradlew.bat rename to chapter_5_thread_synchronization_part2/lecture_1_count_down_latch/gradlew.bat diff --git a/chapter_5/lecture_1_count_down_latch/settings.gradle b/chapter_5_thread_synchronization_part2/lecture_1_count_down_latch/settings.gradle similarity index 100% rename from chapter_5/lecture_1_count_down_latch/settings.gradle rename to chapter_5_thread_synchronization_part2/lecture_1_count_down_latch/settings.gradle diff --git a/chapter_5/lecture_1_count_down_latch/src/main/java/Main.java b/chapter_5_thread_synchronization_part2/lecture_1_count_down_latch/src/main/java/Main.java similarity index 100% rename from chapter_5/lecture_1_count_down_latch/src/main/java/Main.java rename to chapter_5_thread_synchronization_part2/lecture_1_count_down_latch/src/main/java/Main.java diff --git a/chapter_5/lecture_2_cyclic_barrier/build.gradle b/chapter_5_thread_synchronization_part2/lecture_2_cyclic_barrier/build.gradle similarity index 100% rename from chapter_5/lecture_2_cyclic_barrier/build.gradle rename to chapter_5_thread_synchronization_part2/lecture_2_cyclic_barrier/build.gradle diff --git a/chapter_5/lecture_2_cyclic_barrier/gradle/wrapper/gradle-wrapper.jar b/chapter_5_thread_synchronization_part2/lecture_2_cyclic_barrier/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from chapter_5/lecture_2_cyclic_barrier/gradle/wrapper/gradle-wrapper.jar rename to chapter_5_thread_synchronization_part2/lecture_2_cyclic_barrier/gradle/wrapper/gradle-wrapper.jar diff --git a/chapter_5/lecture_2_cyclic_barrier/gradle/wrapper/gradle-wrapper.properties b/chapter_5_thread_synchronization_part2/lecture_2_cyclic_barrier/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from chapter_5/lecture_2_cyclic_barrier/gradle/wrapper/gradle-wrapper.properties rename to chapter_5_thread_synchronization_part2/lecture_2_cyclic_barrier/gradle/wrapper/gradle-wrapper.properties diff --git a/chapter_5/lecture_2_cyclic_barrier/gradlew b/chapter_5_thread_synchronization_part2/lecture_2_cyclic_barrier/gradlew similarity index 100% rename from chapter_5/lecture_2_cyclic_barrier/gradlew rename to chapter_5_thread_synchronization_part2/lecture_2_cyclic_barrier/gradlew diff --git a/chapter_5/lecture_2_cyclic_barrier/gradlew.bat b/chapter_5_thread_synchronization_part2/lecture_2_cyclic_barrier/gradlew.bat similarity index 100% rename from chapter_5/lecture_2_cyclic_barrier/gradlew.bat rename to chapter_5_thread_synchronization_part2/lecture_2_cyclic_barrier/gradlew.bat diff --git a/chapter_5/lecture_2_cyclic_barrier/settings.gradle b/chapter_5_thread_synchronization_part2/lecture_2_cyclic_barrier/settings.gradle similarity index 100% rename from chapter_5/lecture_2_cyclic_barrier/settings.gradle rename to chapter_5_thread_synchronization_part2/lecture_2_cyclic_barrier/settings.gradle diff --git a/chapter_5/lecture_2_cyclic_barrier/src/main/java/Main.java b/chapter_5_thread_synchronization_part2/lecture_2_cyclic_barrier/src/main/java/Main.java similarity index 100% rename from chapter_5/lecture_2_cyclic_barrier/src/main/java/Main.java rename to chapter_5_thread_synchronization_part2/lecture_2_cyclic_barrier/src/main/java/Main.java diff --git a/chapter_5/lecture_3_phaser/build.gradle b/chapter_5_thread_synchronization_part2/lecture_3_phaser/build.gradle similarity index 100% rename from chapter_5/lecture_3_phaser/build.gradle rename to chapter_5_thread_synchronization_part2/lecture_3_phaser/build.gradle diff --git a/chapter_5/lecture_3_phaser/gradle/wrapper/gradle-wrapper.jar b/chapter_5_thread_synchronization_part2/lecture_3_phaser/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from chapter_5/lecture_3_phaser/gradle/wrapper/gradle-wrapper.jar rename to chapter_5_thread_synchronization_part2/lecture_3_phaser/gradle/wrapper/gradle-wrapper.jar diff --git a/chapter_5/lecture_3_phaser/gradle/wrapper/gradle-wrapper.properties b/chapter_5_thread_synchronization_part2/lecture_3_phaser/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from chapter_5/lecture_3_phaser/gradle/wrapper/gradle-wrapper.properties rename to chapter_5_thread_synchronization_part2/lecture_3_phaser/gradle/wrapper/gradle-wrapper.properties diff --git a/chapter_5/lecture_3_phaser/gradlew b/chapter_5_thread_synchronization_part2/lecture_3_phaser/gradlew similarity index 100% rename from chapter_5/lecture_3_phaser/gradlew rename to chapter_5_thread_synchronization_part2/lecture_3_phaser/gradlew diff --git a/chapter_5/lecture_3_phaser/gradlew.bat b/chapter_5_thread_synchronization_part2/lecture_3_phaser/gradlew.bat similarity index 100% rename from chapter_5/lecture_3_phaser/gradlew.bat rename to chapter_5_thread_synchronization_part2/lecture_3_phaser/gradlew.bat diff --git a/chapter_5/lecture_3_phaser/settings.gradle b/chapter_5_thread_synchronization_part2/lecture_3_phaser/settings.gradle similarity index 100% rename from chapter_5/lecture_3_phaser/settings.gradle rename to chapter_5_thread_synchronization_part2/lecture_3_phaser/settings.gradle diff --git a/chapter_5/lecture_3_phaser/src/main/java/Main.java b/chapter_5_thread_synchronization_part2/lecture_3_phaser/src/main/java/Main.java similarity index 100% rename from chapter_5/lecture_3_phaser/src/main/java/Main.java rename to chapter_5_thread_synchronization_part2/lecture_3_phaser/src/main/java/Main.java diff --git a/chapter_5/lecture_4_exchanger/build.gradle b/chapter_5_thread_synchronization_part2/lecture_4_exchanger/build.gradle similarity index 100% rename from chapter_5/lecture_4_exchanger/build.gradle rename to chapter_5_thread_synchronization_part2/lecture_4_exchanger/build.gradle diff --git a/chapter_5/lecture_4_exchanger/gradle/wrapper/gradle-wrapper.jar b/chapter_5_thread_synchronization_part2/lecture_4_exchanger/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from chapter_5/lecture_4_exchanger/gradle/wrapper/gradle-wrapper.jar rename to chapter_5_thread_synchronization_part2/lecture_4_exchanger/gradle/wrapper/gradle-wrapper.jar diff --git a/chapter_5/lecture_4_exchanger/gradle/wrapper/gradle-wrapper.properties b/chapter_5_thread_synchronization_part2/lecture_4_exchanger/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from chapter_5/lecture_4_exchanger/gradle/wrapper/gradle-wrapper.properties rename to chapter_5_thread_synchronization_part2/lecture_4_exchanger/gradle/wrapper/gradle-wrapper.properties diff --git a/chapter_5/lecture_4_exchanger/gradlew b/chapter_5_thread_synchronization_part2/lecture_4_exchanger/gradlew similarity index 100% rename from chapter_5/lecture_4_exchanger/gradlew rename to chapter_5_thread_synchronization_part2/lecture_4_exchanger/gradlew diff --git a/chapter_5/lecture_4_exchanger/gradlew.bat b/chapter_5_thread_synchronization_part2/lecture_4_exchanger/gradlew.bat similarity index 100% rename from chapter_5/lecture_4_exchanger/gradlew.bat rename to chapter_5_thread_synchronization_part2/lecture_4_exchanger/gradlew.bat diff --git a/chapter_5/lecture_4_exchanger/settings.gradle b/chapter_5_thread_synchronization_part2/lecture_4_exchanger/settings.gradle similarity index 100% rename from chapter_5/lecture_4_exchanger/settings.gradle rename to chapter_5_thread_synchronization_part2/lecture_4_exchanger/settings.gradle diff --git a/chapter_5/lecture_4_exchanger/src/main/java/Main.java b/chapter_5_thread_synchronization_part2/lecture_4_exchanger/src/main/java/Main.java similarity index 100% rename from chapter_5/lecture_4_exchanger/src/main/java/Main.java rename to chapter_5_thread_synchronization_part2/lecture_4_exchanger/src/main/java/Main.java diff --git a/chapter_5/lecture_5_deadlocks_and_livelocks/build.gradle b/chapter_5_thread_synchronization_part2/lecture_5_deadlocks_and_livelocks/build.gradle similarity index 100% rename from chapter_5/lecture_5_deadlocks_and_livelocks/build.gradle rename to chapter_5_thread_synchronization_part2/lecture_5_deadlocks_and_livelocks/build.gradle diff --git a/chapter_5/lecture_5_deadlocks_and_livelocks/gradle/wrapper/gradle-wrapper.jar b/chapter_5_thread_synchronization_part2/lecture_5_deadlocks_and_livelocks/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from chapter_5/lecture_5_deadlocks_and_livelocks/gradle/wrapper/gradle-wrapper.jar rename to chapter_5_thread_synchronization_part2/lecture_5_deadlocks_and_livelocks/gradle/wrapper/gradle-wrapper.jar diff --git a/chapter_5/lecture_5_deadlocks_and_livelocks/gradle/wrapper/gradle-wrapper.properties b/chapter_5_thread_synchronization_part2/lecture_5_deadlocks_and_livelocks/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from chapter_5/lecture_5_deadlocks_and_livelocks/gradle/wrapper/gradle-wrapper.properties rename to chapter_5_thread_synchronization_part2/lecture_5_deadlocks_and_livelocks/gradle/wrapper/gradle-wrapper.properties diff --git a/chapter_5/lecture_5_deadlocks_and_livelocks/gradlew b/chapter_5_thread_synchronization_part2/lecture_5_deadlocks_and_livelocks/gradlew similarity index 100% rename from chapter_5/lecture_5_deadlocks_and_livelocks/gradlew rename to chapter_5_thread_synchronization_part2/lecture_5_deadlocks_and_livelocks/gradlew diff --git a/chapter_5/lecture_5_deadlocks_and_livelocks/gradlew.bat b/chapter_5_thread_synchronization_part2/lecture_5_deadlocks_and_livelocks/gradlew.bat similarity index 100% rename from chapter_5/lecture_5_deadlocks_and_livelocks/gradlew.bat rename to chapter_5_thread_synchronization_part2/lecture_5_deadlocks_and_livelocks/gradlew.bat diff --git a/chapter_5/lecture_5_deadlocks_and_livelocks/settings.gradle b/chapter_5_thread_synchronization_part2/lecture_5_deadlocks_and_livelocks/settings.gradle similarity index 100% rename from chapter_5/lecture_5_deadlocks_and_livelocks/settings.gradle rename to chapter_5_thread_synchronization_part2/lecture_5_deadlocks_and_livelocks/settings.gradle diff --git a/chapter_5/lecture_5_deadlocks_and_livelocks/src/main/java/Main.java b/chapter_5_thread_synchronization_part2/lecture_5_deadlocks_and_livelocks/src/main/java/Main.java similarity index 100% rename from chapter_5/lecture_5_deadlocks_and_livelocks/src/main/java/Main.java rename to chapter_5_thread_synchronization_part2/lecture_5_deadlocks_and_livelocks/src/main/java/Main.java diff --git a/chapter_5/lecture_6_volatile/build.gradle b/chapter_5_thread_synchronization_part2/lecture_6_volatile/build.gradle similarity index 100% rename from chapter_5/lecture_6_volatile/build.gradle rename to chapter_5_thread_synchronization_part2/lecture_6_volatile/build.gradle diff --git a/chapter_5/lecture_6_volatile/gradle/wrapper/gradle-wrapper.jar b/chapter_5_thread_synchronization_part2/lecture_6_volatile/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from chapter_5/lecture_6_volatile/gradle/wrapper/gradle-wrapper.jar rename to chapter_5_thread_synchronization_part2/lecture_6_volatile/gradle/wrapper/gradle-wrapper.jar diff --git a/chapter_5/lecture_6_volatile/gradle/wrapper/gradle-wrapper.properties b/chapter_5_thread_synchronization_part2/lecture_6_volatile/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from chapter_5/lecture_6_volatile/gradle/wrapper/gradle-wrapper.properties rename to chapter_5_thread_synchronization_part2/lecture_6_volatile/gradle/wrapper/gradle-wrapper.properties diff --git a/chapter_5/lecture_6_volatile/gradlew b/chapter_5_thread_synchronization_part2/lecture_6_volatile/gradlew similarity index 100% rename from chapter_5/lecture_6_volatile/gradlew rename to chapter_5_thread_synchronization_part2/lecture_6_volatile/gradlew diff --git a/chapter_5/lecture_6_volatile/gradlew.bat b/chapter_5_thread_synchronization_part2/lecture_6_volatile/gradlew.bat similarity index 100% rename from chapter_5/lecture_6_volatile/gradlew.bat rename to chapter_5_thread_synchronization_part2/lecture_6_volatile/gradlew.bat diff --git a/chapter_5/lecture_6_volatile/settings.gradle b/chapter_5_thread_synchronization_part2/lecture_6_volatile/settings.gradle similarity index 100% rename from chapter_5/lecture_6_volatile/settings.gradle rename to chapter_5_thread_synchronization_part2/lecture_6_volatile/settings.gradle diff --git a/chapter_5/lecture_6_volatile/src/main/java/Main.java b/chapter_5_thread_synchronization_part2/lecture_6_volatile/src/main/java/Main.java similarity index 100% rename from chapter_5/lecture_6_volatile/src/main/java/Main.java rename to chapter_5_thread_synchronization_part2/lecture_6_volatile/src/main/java/Main.java diff --git a/chapter_5/project_simulating_mapreduce_with_threads/build.gradle b/chapter_5_thread_synchronization_part2/project_simulating_mapreduce_with_threads/build.gradle similarity index 100% rename from chapter_5/project_simulating_mapreduce_with_threads/build.gradle rename to chapter_5_thread_synchronization_part2/project_simulating_mapreduce_with_threads/build.gradle diff --git a/chapter_5/project_simulating_mapreduce_with_threads/gradle/wrapper/gradle-wrapper.jar b/chapter_5_thread_synchronization_part2/project_simulating_mapreduce_with_threads/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from chapter_5/project_simulating_mapreduce_with_threads/gradle/wrapper/gradle-wrapper.jar rename to chapter_5_thread_synchronization_part2/project_simulating_mapreduce_with_threads/gradle/wrapper/gradle-wrapper.jar diff --git a/chapter_5/project_simulating_mapreduce_with_threads/gradle/wrapper/gradle-wrapper.properties b/chapter_5_thread_synchronization_part2/project_simulating_mapreduce_with_threads/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from chapter_5/project_simulating_mapreduce_with_threads/gradle/wrapper/gradle-wrapper.properties rename to chapter_5_thread_synchronization_part2/project_simulating_mapreduce_with_threads/gradle/wrapper/gradle-wrapper.properties diff --git a/chapter_5/project_simulating_mapreduce_with_threads/gradlew b/chapter_5_thread_synchronization_part2/project_simulating_mapreduce_with_threads/gradlew similarity index 100% rename from chapter_5/project_simulating_mapreduce_with_threads/gradlew rename to chapter_5_thread_synchronization_part2/project_simulating_mapreduce_with_threads/gradlew diff --git a/chapter_5/project_simulating_mapreduce_with_threads/gradlew.bat b/chapter_5_thread_synchronization_part2/project_simulating_mapreduce_with_threads/gradlew.bat similarity index 100% rename from chapter_5/project_simulating_mapreduce_with_threads/gradlew.bat rename to chapter_5_thread_synchronization_part2/project_simulating_mapreduce_with_threads/gradlew.bat diff --git a/chapter_5/project_simulating_mapreduce_with_threads/settings.gradle b/chapter_5_thread_synchronization_part2/project_simulating_mapreduce_with_threads/settings.gradle similarity index 100% rename from chapter_5/project_simulating_mapreduce_with_threads/settings.gradle rename to chapter_5_thread_synchronization_part2/project_simulating_mapreduce_with_threads/settings.gradle diff --git a/chapter_5/project_simulating_mapreduce_with_threads/src/main/java/Main.java b/chapter_5_thread_synchronization_part2/project_simulating_mapreduce_with_threads/src/main/java/Main.java similarity index 100% rename from chapter_5/project_simulating_mapreduce_with_threads/src/main/java/Main.java rename to chapter_5_thread_synchronization_part2/project_simulating_mapreduce_with_threads/src/main/java/Main.java From 2f0543e8324546c1e089b7c7700ef91ab8066578 Mon Sep 17 00:00:00 2001 From: jeanfern5 Date: Mon, 27 May 2024 16:51:44 -0700 Subject: [PATCH 31/40] chapter_3_thread_management/lecture_7_project_parallel_text_file_processing: fix race condition issue --- .../src/main/java/Main.java | 21 ++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/chapter_3_thread_management/lecture_7_project_parallel_text_file_processing/src/main/java/Main.java b/chapter_3_thread_management/lecture_7_project_parallel_text_file_processing/src/main/java/Main.java index fb5e817..825b962 100644 --- a/chapter_3_thread_management/lecture_7_project_parallel_text_file_processing/src/main/java/Main.java +++ b/chapter_3_thread_management/lecture_7_project_parallel_text_file_processing/src/main/java/Main.java @@ -8,6 +8,8 @@ import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.*; +import java.util.concurrent.ConcurrentHashMap; + /** * === REQUIREMENTS === * 1. Periodically scans the ./src/main/resources directory and watches for new files @@ -27,9 +29,9 @@ public class Main { // 2. add file to map before completing the process - risk file has an error and marked as "successful" when in fact it failed (file misses) // 3. add a "pending" state where it shows the file is in progress so that the new thread doesn't work on processing the file <---- best choice -// static Map> processedFiles = new HashMap<>(); // Not a perfect solution due to race conditions + // static Map> processedFiles = new HashMap<>(); // Not a perfect solution due to race conditions - /** + /* * improved but not perfect: adding "volatile" keyword seems to have helped with race condition issue where the same file was being * processed more than once - tried about 20 times * this is due to the shared variable been up-to-date since it's getting the value from the main memory instead @@ -37,7 +39,20 @@ public class Main { * * This can still lead to a race condition but for this specific setup it doesn't since it's basic enough * */ - static volatile Map> processedFiles = new HashMap<>(); + // static volatile Map> processedFiles = new HashMap<>(); // first improvement - not great but can help in basic usages, if complex can still lead to raise condition + + /** + * A better way is to use concurrent datastructures that are thread safe such as + * "Collections.synchronizedMap(new HashMap<>())" or "new ConcurrentHashMap<>()". + * ConcurrentHashMap has better performance and no need to manually synchronize when iterating map; however it + * has a higher memory overhead. For simple scenarios Collections.synchronizedMap can work. + * For concurrency applications using ConcurrentHashMap is much better. + * + * Concurrent datastructures are thread safe due to the following being done under the hood: + * fine grain locking, atomic updates without fulling locking, using linked list and trees + * for better collision handling, and better use of volatile variables. + */ + static Map> processedFiles = new ConcurrentHashMap<>(); public static void main(String[] args) { new Thread(new Watcher(processedFiles)).start(); From 003b41e76adc339716fffe3f2c4262e32a05abab Mon Sep 17 00:00:00 2001 From: jeanfern5 Date: Sun, 7 Jul 2024 13:34:50 -0700 Subject: [PATCH 32/40] Completed lecture 2 - 4 * Lecture 2: Getting familiarized with ThreadPoolExecutor * Lecture 3: Work Queues * Lecture 4: Handling Exception --- chapter_6/lecture_2/src/main/java/Main.java | 38 ------ .../build.gradle | 0 .../gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 .../gradlew | 0 .../gradlew.bat | 0 .../settings.gradle | 0 .../src/main/java/Main.java | 119 ++++++++++++++++++ 8 files changed, 119 insertions(+), 38 deletions(-) delete mode 100644 chapter_6/lecture_2/src/main/java/Main.java rename chapter_6/{lecture_2 => lecture_2_threadpools}/build.gradle (100%) rename chapter_6/{lecture_2 => lecture_2_threadpools}/gradle/wrapper/gradle-wrapper.jar (100%) rename chapter_6/{lecture_2 => lecture_2_threadpools}/gradle/wrapper/gradle-wrapper.properties (100%) rename chapter_6/{lecture_2 => lecture_2_threadpools}/gradlew (100%) rename chapter_6/{lecture_2 => lecture_2_threadpools}/gradlew.bat (100%) rename chapter_6/{lecture_2 => lecture_2_threadpools}/settings.gradle (100%) create mode 100644 chapter_6/lecture_2_threadpools/src/main/java/Main.java diff --git a/chapter_6/lecture_2/src/main/java/Main.java b/chapter_6/lecture_2/src/main/java/Main.java deleted file mode 100644 index cba3d2f..0000000 --- a/chapter_6/lecture_2/src/main/java/Main.java +++ /dev/null @@ -1,38 +0,0 @@ -import java.util.concurrent.*; - -public class Main { - public static void main(String[] args) throws ExecutionException, InterruptedException { - ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor( - 3, - 5, - 1, - TimeUnit.MINUTES, - new ArrayBlockingQueue<>(3) - ); - - threadPoolExecutor.prestartAllCoreThreads(); - - threadPoolExecutor.execute(() -> System.out.println("Task 1")); - threadPoolExecutor.execute(() -> System.out.println("Task 2")); - - System.out.println("Pool size: " + threadPoolExecutor.getPoolSize()); - - threadPoolExecutor.shutdown(); - threadPoolExecutor.awaitTermination(3, TimeUnit.SECONDS); - -// Future future = threadPoolExecutor.submit(new CallableTask()); -// -// // Do other stuff -// Integer result = future.get(); - - } - - static class CallableTask implements Callable { - - @Override - public Integer call() throws Exception { - // Do some work - return 4; - } - } -} diff --git a/chapter_6/lecture_2/build.gradle b/chapter_6/lecture_2_threadpools/build.gradle similarity index 100% rename from chapter_6/lecture_2/build.gradle rename to chapter_6/lecture_2_threadpools/build.gradle diff --git a/chapter_6/lecture_2/gradle/wrapper/gradle-wrapper.jar b/chapter_6/lecture_2_threadpools/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from chapter_6/lecture_2/gradle/wrapper/gradle-wrapper.jar rename to chapter_6/lecture_2_threadpools/gradle/wrapper/gradle-wrapper.jar diff --git a/chapter_6/lecture_2/gradle/wrapper/gradle-wrapper.properties b/chapter_6/lecture_2_threadpools/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from chapter_6/lecture_2/gradle/wrapper/gradle-wrapper.properties rename to chapter_6/lecture_2_threadpools/gradle/wrapper/gradle-wrapper.properties diff --git a/chapter_6/lecture_2/gradlew b/chapter_6/lecture_2_threadpools/gradlew similarity index 100% rename from chapter_6/lecture_2/gradlew rename to chapter_6/lecture_2_threadpools/gradlew diff --git a/chapter_6/lecture_2/gradlew.bat b/chapter_6/lecture_2_threadpools/gradlew.bat similarity index 100% rename from chapter_6/lecture_2/gradlew.bat rename to chapter_6/lecture_2_threadpools/gradlew.bat diff --git a/chapter_6/lecture_2/settings.gradle b/chapter_6/lecture_2_threadpools/settings.gradle similarity index 100% rename from chapter_6/lecture_2/settings.gradle rename to chapter_6/lecture_2_threadpools/settings.gradle diff --git a/chapter_6/lecture_2_threadpools/src/main/java/Main.java b/chapter_6/lecture_2_threadpools/src/main/java/Main.java new file mode 100644 index 0000000..3269cca --- /dev/null +++ b/chapter_6/lecture_2_threadpools/src/main/java/Main.java @@ -0,0 +1,119 @@ +import java.util.concurrent.*; + +public class Main { + public static void main(String[] args) throws ExecutionException, InterruptedException { + ThreadPoolExecutor threadPoolExecutor = new CustomThreadPoolExecuter( + 2, + 2, + 1, + TimeUnit.MINUTES, + new ArrayBlockingQueue<>(2) + // Types of Work Queues: + // bounded: new ArrayBlockingQueue<>(3) - has limited capacity and default access policy + // unbounded: new LinkedBlockingQueue<>() - not used often due to memory impact where queue can get full and lead to OOM + // synchronous: new SynchronousQueue<>() - has nonfair access policy therefore it doesn't store any tasks instead it hands-off tasks + ); +// // Lecture 4: Handling Exception +// // approach 1: within the task - best way since it's better to keep closer to the tasks, makes it easier for debugging +// threadPoolExecutor.submit(() -> { +// try { +// throw new RuntimeException(); +// } catch (Exception e) { +// e.printStackTrace(); +// } +// }); +// // approach 2: as a future +// Future future = threadPoolExecutor.submit(() -> { +// throw new RuntimeException("test exception"); +// }); +// try { +// future.get(); +// } catch (InterruptedException | ExecutionException e) { +// e.printStackTrace(); +// } +// // approach 3: with custom executer - see CustomThreadPoolExecuter - not the best way but good to know since it can be in legacy code +// Future future = threadPoolExecutor.submit(() -> { +// throw new RuntimeException("test exception"); +// }); + +// // Lecture 3: Work Queues +// threadPoolExecutor.submit(() -> { +// try { +// Thread.sleep(3000); +// } catch (InterruptedException e) { +// e.printStackTrace(); +// } +// }); +// System.out.println("Task 1"); +// +// threadPoolExecutor.submit(() -> { +// try { +// Thread.sleep(3000); +// } catch (InterruptedException e) { +// e.printStackTrace(); +// } +// }); +// System.out.println("Task 2"); +// +// // Expected to be rejected since the thread limit is 2 +// threadPoolExecutor.submit(() -> { +// try { +// Thread.sleep(3000); +// } catch (InterruptedException e) { +// e.printStackTrace(); +// } +// }); +// System.out.println("Task 3"); + +// // Lecture 2: Getting familiarized with ThreadPoolExecutor +// threadPoolExecutor.prestartAllCoreThreads(); // creates all corePoolSize threads +// System.out.println("Pool size: " + threadPoolExecutor.getPoolSize()); + +// // Methods to close the application +// threadPoolExecutor.shutdown(); // graceful way to close thread pool by stop accepting new tasks into the queue and wait to complete existing tasks +//// threadPoolExecutor.shutdownNow(); // stops actively executing tasks and return tasks that were waiting in to be executed +// threadPoolExecutor.awaitTermination(3, TimeUnit.SECONDS); // blocks until all tasks have completed execution after a shutdown request, timeout occurs, or thread is interrupted - whichever happens first + + +// Future future = threadPoolExecutor.submit(new CallableTask()); // submits tasks to the ThreadPoolExecutor +// // Do other stuff +// Integer result = future.get(); // checks if result is available - if yes, returns result - if not, waits for results and then returns it + } + + //// approach 3: with custom executer + static class CustomThreadPoolExecuter extends ThreadPoolExecutor { + + public CustomThreadPoolExecuter(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue workQueue) { + super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue); + } + + public CustomThreadPoolExecuter(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue workQueue, ThreadFactory threadFactory) { + super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory); + } + + public CustomThreadPoolExecuter(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue workQueue, RejectedExecutionHandler handler) { + super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, handler); + } + + public CustomThreadPoolExecuter(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler) { + super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory, handler); + } + + @Override + protected void afterExecute(Runnable r, Throwable t) { + super.afterExecute(r, t); + + if (t != null) { + System.out.println("CustomThreadPoolExecuter.afterExecuter.t = " + t); + } + } + } + + static class CallableTask implements Callable { + @Override + public Integer call() throws Exception { + // Do some work + return 4; + } + } +} From 701553dd37abe456572abc8957d02ad7877f5d73 Mon Sep 17 00:00:00 2001 From: jeanfern5 Date: Sun, 7 Jul 2024 14:22:51 -0700 Subject: [PATCH 33/40] Completed lecture 5 - 6 * Lecture 5: Managing Rejected Tasks in ThreadPool * Lecture 6: Monitoring the Performance of a ThreadPool --- chapter_6/lecture_5/src/main/java/Main.java | 45 ------------- .../build.gradle | 0 .../gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 .../gradlew | 0 .../gradlew.bat | 0 .../settings.gradle | 0 .../src/main/java/Main.java | 62 ++++++++++++++++++ 8 files changed, 62 insertions(+), 45 deletions(-) delete mode 100644 chapter_6/lecture_5/src/main/java/Main.java rename chapter_6/{lecture_5 => lecture_5_managing_rejected_and_monitoring_threads}/build.gradle (100%) rename chapter_6/{lecture_5 => lecture_5_managing_rejected_and_monitoring_threads}/gradle/wrapper/gradle-wrapper.jar (100%) rename chapter_6/{lecture_5 => lecture_5_managing_rejected_and_monitoring_threads}/gradle/wrapper/gradle-wrapper.properties (100%) rename chapter_6/{lecture_5 => lecture_5_managing_rejected_and_monitoring_threads}/gradlew (100%) rename chapter_6/{lecture_5 => lecture_5_managing_rejected_and_monitoring_threads}/gradlew.bat (100%) rename chapter_6/{lecture_5 => lecture_5_managing_rejected_and_monitoring_threads}/settings.gradle (100%) create mode 100644 chapter_6/lecture_5_managing_rejected_and_monitoring_threads/src/main/java/Main.java diff --git a/chapter_6/lecture_5/src/main/java/Main.java b/chapter_6/lecture_5/src/main/java/Main.java deleted file mode 100644 index 0870b17..0000000 --- a/chapter_6/lecture_5/src/main/java/Main.java +++ /dev/null @@ -1,45 +0,0 @@ -import java.util.concurrent.*; - -public class Main { - public static void main(String[] args) { - ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor( - 2, - 3, - 1, - TimeUnit.MINUTES, - new ArrayBlockingQueue<>(2), - new ThreadPoolExecutor.DiscardPolicy() - ); - - threadPoolExecutor.submit(new SleepingTask(1)); - threadPoolExecutor.submit(new SleepingTask(2)); - - System.out.println("[1] Pool size: " + threadPoolExecutor.getPoolSize()); - - threadPoolExecutor.submit(new SleepingTask(3)); - threadPoolExecutor.submit(new SleepingTask(4)); - - threadPoolExecutor.submit(new SleepingTask(5)); - System.out.println("[2] Pool size: " + threadPoolExecutor.getPoolSize()); - - threadPoolExecutor.submit(new SleepingTask(6)); - } - - static class SleepingTask implements Runnable { - - private final int id; - - public SleepingTask(int id) { - this.id = id; - } - - @Override - public void run() { - try { - Thread.sleep(99999); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - } -} diff --git a/chapter_6/lecture_5/build.gradle b/chapter_6/lecture_5_managing_rejected_and_monitoring_threads/build.gradle similarity index 100% rename from chapter_6/lecture_5/build.gradle rename to chapter_6/lecture_5_managing_rejected_and_monitoring_threads/build.gradle diff --git a/chapter_6/lecture_5/gradle/wrapper/gradle-wrapper.jar b/chapter_6/lecture_5_managing_rejected_and_monitoring_threads/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from chapter_6/lecture_5/gradle/wrapper/gradle-wrapper.jar rename to chapter_6/lecture_5_managing_rejected_and_monitoring_threads/gradle/wrapper/gradle-wrapper.jar diff --git a/chapter_6/lecture_5/gradle/wrapper/gradle-wrapper.properties b/chapter_6/lecture_5_managing_rejected_and_monitoring_threads/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from chapter_6/lecture_5/gradle/wrapper/gradle-wrapper.properties rename to chapter_6/lecture_5_managing_rejected_and_monitoring_threads/gradle/wrapper/gradle-wrapper.properties diff --git a/chapter_6/lecture_5/gradlew b/chapter_6/lecture_5_managing_rejected_and_monitoring_threads/gradlew similarity index 100% rename from chapter_6/lecture_5/gradlew rename to chapter_6/lecture_5_managing_rejected_and_monitoring_threads/gradlew diff --git a/chapter_6/lecture_5/gradlew.bat b/chapter_6/lecture_5_managing_rejected_and_monitoring_threads/gradlew.bat similarity index 100% rename from chapter_6/lecture_5/gradlew.bat rename to chapter_6/lecture_5_managing_rejected_and_monitoring_threads/gradlew.bat diff --git a/chapter_6/lecture_5/settings.gradle b/chapter_6/lecture_5_managing_rejected_and_monitoring_threads/settings.gradle similarity index 100% rename from chapter_6/lecture_5/settings.gradle rename to chapter_6/lecture_5_managing_rejected_and_monitoring_threads/settings.gradle diff --git a/chapter_6/lecture_5_managing_rejected_and_monitoring_threads/src/main/java/Main.java b/chapter_6/lecture_5_managing_rejected_and_monitoring_threads/src/main/java/Main.java new file mode 100644 index 0000000..f5bada2 --- /dev/null +++ b/chapter_6/lecture_5_managing_rejected_and_monitoring_threads/src/main/java/Main.java @@ -0,0 +1,62 @@ +import java.util.concurrent.*; + +public class Main { + // Lecture 5: Managing Rejected Tasks in ThreadPool - related to "RejectedExecutionHandler" + // Lecture 6: Monitoring the Performance of a ThreadPool - related to metrics + public static void main(String[] args) { + ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor( + 2, + 3, + 1, + TimeUnit.MINUTES, + new ArrayBlockingQueue<>(2), + (Runnable r, ThreadPoolExecutor executer) -> { // if RejectedExecutionHandler used, the exception won't be thrown anymore + // push some metric to system + System.out.println("Task rejected"); + } +// new ThreadPoolExecutor.CallerRunsPolicy() // retry on the caller thread +// new ThreadPoolExecutor.DiscardOldestPolicy() // makes room in the queue for new task to be retried +// new ThreadPoolExecutor.DiscardPolicy() // does nothing - task will get discarded + ); +//// Lecture 6: Monitoring the Performance of a ThreadPool + threadPoolExecutor.getPoolSize(); // returns the number of threads currently used + threadPoolExecutor.getActiveCount(); // return number of threads are executing tasks + threadPoolExecutor.getTaskCount(); // correlates to the queue size + threadPoolExecutor.getCompletedTaskCount(); // calculate completed tasks + // should add metric to rejected tasks + + +//// Lecture 5: Managing Rejected Tasks in ThreadPool - related to "RejectedExecutionHandler" +// threadPoolExecutor.submit(new SleepingTask(1)); +// threadPoolExecutor.submit(new SleepingTask(2)); +// +// System.out.println("[1] Pool size: " + threadPoolExecutor.getPoolSize()); +// +// threadPoolExecutor.submit(new SleepingTask(3)); +// threadPoolExecutor.submit(new SleepingTask(4)); +// threadPoolExecutor.submit(new SleepingTask(5)); +// +// System.out.println("[2] Pool size: " + threadPoolExecutor.getPoolSize()); +// +// threadPoolExecutor.submit(new SleepingTask(6)); // expected to be rejected since the max pool size is 3 +// +// System.out.println("[3] Pool size: " + threadPoolExecutor.getPoolSize()); + } + + static class SleepingTask implements Runnable { + private final int id; + + public SleepingTask(int id) { + this.id = id; + } + + @Override + public void run() { + try { + Thread.sleep(99999); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } +} From c390e8629e4055b9cc10993ae3a0d23a1272fb62 Mon Sep 17 00:00:00 2001 From: jeanfern5 Date: Sun, 7 Jul 2024 14:46:02 -0700 Subject: [PATCH 34/40] Completed --- chapter_6/lecture_7/src/main/java/Main.java | 18 --------------- .../build.gradle | 0 .../gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 .../gradlew | 0 .../gradlew.bat | 0 .../settings.gradle | 0 .../src/main/java/Main.java | 21 ++++++++++++++++++ 8 files changed, 21 insertions(+), 18 deletions(-) delete mode 100644 chapter_6/lecture_7/src/main/java/Main.java rename chapter_6/{lecture_7 => lecture_7_scheduled_threadpool_executor}/build.gradle (100%) rename chapter_6/{lecture_7 => lecture_7_scheduled_threadpool_executor}/gradle/wrapper/gradle-wrapper.jar (100%) rename chapter_6/{lecture_7 => lecture_7_scheduled_threadpool_executor}/gradle/wrapper/gradle-wrapper.properties (100%) rename chapter_6/{lecture_7 => lecture_7_scheduled_threadpool_executor}/gradlew (100%) rename chapter_6/{lecture_7 => lecture_7_scheduled_threadpool_executor}/gradlew.bat (100%) rename chapter_6/{lecture_7 => lecture_7_scheduled_threadpool_executor}/settings.gradle (100%) create mode 100644 chapter_6/lecture_7_scheduled_threadpool_executor/src/main/java/Main.java diff --git a/chapter_6/lecture_7/src/main/java/Main.java b/chapter_6/lecture_7/src/main/java/Main.java deleted file mode 100644 index e71d4f8..0000000 --- a/chapter_6/lecture_7/src/main/java/Main.java +++ /dev/null @@ -1,18 +0,0 @@ -import java.util.concurrent.ScheduledFuture; -import java.util.concurrent.ScheduledThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - -public class Main { - public static void main(String[] args) { - ScheduledThreadPoolExecutor threadPoolExecutor = new ScheduledThreadPoolExecutor(3); - -// threadPoolExecutor.schedule(() -> System.out.println("Task"), 5, TimeUnit.SECONDS); - ScheduledFuture future = threadPoolExecutor.scheduleAtFixedRate(() -> System.out.println("Task"), 5, 1, TimeUnit.SECONDS); - - threadPoolExecutor.shutdown(); - threadPoolExecutor.shutdownNow(); - threadPoolExecutor.setExecuteExistingDelayedTasksAfterShutdownPolicy(true); - threadPoolExecutor.setContinueExistingPeriodicTasksAfterShutdownPolicy(true); - - } -} diff --git a/chapter_6/lecture_7/build.gradle b/chapter_6/lecture_7_scheduled_threadpool_executor/build.gradle similarity index 100% rename from chapter_6/lecture_7/build.gradle rename to chapter_6/lecture_7_scheduled_threadpool_executor/build.gradle diff --git a/chapter_6/lecture_7/gradle/wrapper/gradle-wrapper.jar b/chapter_6/lecture_7_scheduled_threadpool_executor/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from chapter_6/lecture_7/gradle/wrapper/gradle-wrapper.jar rename to chapter_6/lecture_7_scheduled_threadpool_executor/gradle/wrapper/gradle-wrapper.jar diff --git a/chapter_6/lecture_7/gradle/wrapper/gradle-wrapper.properties b/chapter_6/lecture_7_scheduled_threadpool_executor/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from chapter_6/lecture_7/gradle/wrapper/gradle-wrapper.properties rename to chapter_6/lecture_7_scheduled_threadpool_executor/gradle/wrapper/gradle-wrapper.properties diff --git a/chapter_6/lecture_7/gradlew b/chapter_6/lecture_7_scheduled_threadpool_executor/gradlew similarity index 100% rename from chapter_6/lecture_7/gradlew rename to chapter_6/lecture_7_scheduled_threadpool_executor/gradlew diff --git a/chapter_6/lecture_7/gradlew.bat b/chapter_6/lecture_7_scheduled_threadpool_executor/gradlew.bat similarity index 100% rename from chapter_6/lecture_7/gradlew.bat rename to chapter_6/lecture_7_scheduled_threadpool_executor/gradlew.bat diff --git a/chapter_6/lecture_7/settings.gradle b/chapter_6/lecture_7_scheduled_threadpool_executor/settings.gradle similarity index 100% rename from chapter_6/lecture_7/settings.gradle rename to chapter_6/lecture_7_scheduled_threadpool_executor/settings.gradle diff --git a/chapter_6/lecture_7_scheduled_threadpool_executor/src/main/java/Main.java b/chapter_6/lecture_7_scheduled_threadpool_executor/src/main/java/Main.java new file mode 100644 index 0000000..72e6a0a --- /dev/null +++ b/chapter_6/lecture_7_scheduled_threadpool_executor/src/main/java/Main.java @@ -0,0 +1,21 @@ +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +public class Main { + public static void main(String[] args) { + // Extends ThreadPoolExecutor which can be schedule + // starts with an initial capacity but can increase if it needs more - it could reach OOM + ScheduledThreadPoolExecutor threadPoolExecutor = new ScheduledThreadPoolExecutor(3); + +// threadPoolExecutor.schedule(() -> System.out.println("Task"), 5, TimeUnit.SECONDS); +// ScheduledFuture future = threadPoolExecutor.scheduleAtFixedRate(() -> System.out.println("Task"), 5, 1, TimeUnit.SECONDS); // initial delay then it executes at every period - good if you need to schedule task such as polling or pushing metrics/job +// threadPoolExecutor.setRemoveOnCancelPolicy(true); // will remove cancelled tasks from the queue +// future.cancel(true); // cancelled task are not removed from queue and will remain taking up memory + threadPoolExecutor.shutdown(); // graceful shutdown + threadPoolExecutor.shutdownNow(); // forces shutdown quickly + threadPoolExecutor.setExecuteExistingDelayedTasksAfterShutdownPolicy(true); // currently delays tasks will be executed even after shutdown + threadPoolExecutor.setContinueExistingPeriodicTasksAfterShutdownPolicy(true); // similar to above but to be used with "scheduleAtFixedRate" + + } +} From 624435d1883e6d1c0a78c31e19025f771a46e421 Mon Sep 17 00:00:00 2001 From: jeanfern5 Date: Sun, 7 Jul 2024 15:24:19 -0700 Subject: [PATCH 35/40] Completed --- .../build.gradle | 0 .../gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 .../gradlew | 0 .../gradlew.bat | 0 .../settings.gradle | 0 .../src/main/java/Main.java | 14 +++++++++----- 7 files changed, 9 insertions(+), 5 deletions(-) rename chapter_6/{lecture_8 => lecture_8_fork_join_pool}/build.gradle (100%) rename chapter_6/{lecture_8 => lecture_8_fork_join_pool}/gradle/wrapper/gradle-wrapper.jar (100%) rename chapter_6/{lecture_8 => lecture_8_fork_join_pool}/gradle/wrapper/gradle-wrapper.properties (100%) rename chapter_6/{lecture_8 => lecture_8_fork_join_pool}/gradlew (100%) rename chapter_6/{lecture_8 => lecture_8_fork_join_pool}/gradlew.bat (100%) rename chapter_6/{lecture_8 => lecture_8_fork_join_pool}/settings.gradle (100%) rename chapter_6/{lecture_8 => lecture_8_fork_join_pool}/src/main/java/Main.java (60%) diff --git a/chapter_6/lecture_8/build.gradle b/chapter_6/lecture_8_fork_join_pool/build.gradle similarity index 100% rename from chapter_6/lecture_8/build.gradle rename to chapter_6/lecture_8_fork_join_pool/build.gradle diff --git a/chapter_6/lecture_8/gradle/wrapper/gradle-wrapper.jar b/chapter_6/lecture_8_fork_join_pool/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from chapter_6/lecture_8/gradle/wrapper/gradle-wrapper.jar rename to chapter_6/lecture_8_fork_join_pool/gradle/wrapper/gradle-wrapper.jar diff --git a/chapter_6/lecture_8/gradle/wrapper/gradle-wrapper.properties b/chapter_6/lecture_8_fork_join_pool/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from chapter_6/lecture_8/gradle/wrapper/gradle-wrapper.properties rename to chapter_6/lecture_8_fork_join_pool/gradle/wrapper/gradle-wrapper.properties diff --git a/chapter_6/lecture_8/gradlew b/chapter_6/lecture_8_fork_join_pool/gradlew similarity index 100% rename from chapter_6/lecture_8/gradlew rename to chapter_6/lecture_8_fork_join_pool/gradlew diff --git a/chapter_6/lecture_8/gradlew.bat b/chapter_6/lecture_8_fork_join_pool/gradlew.bat similarity index 100% rename from chapter_6/lecture_8/gradlew.bat rename to chapter_6/lecture_8_fork_join_pool/gradlew.bat diff --git a/chapter_6/lecture_8/settings.gradle b/chapter_6/lecture_8_fork_join_pool/settings.gradle similarity index 100% rename from chapter_6/lecture_8/settings.gradle rename to chapter_6/lecture_8_fork_join_pool/settings.gradle diff --git a/chapter_6/lecture_8/src/main/java/Main.java b/chapter_6/lecture_8_fork_join_pool/src/main/java/Main.java similarity index 60% rename from chapter_6/lecture_8/src/main/java/Main.java rename to chapter_6/lecture_8_fork_join_pool/src/main/java/Main.java index 82ee8fe..adecd4e 100644 --- a/chapter_6/lecture_8/src/main/java/Main.java +++ b/chapter_6/lecture_8_fork_join_pool/src/main/java/Main.java @@ -6,9 +6,13 @@ public class Main { private static int[] array = new int[] {1, 2, 3, 4, 5, 6, 7, 8}; public static void main(String[] args) throws ExecutionException, InterruptedException { - ForkJoinPool pool = new ForkJoinPool(2); - - Future future = pool.submit(new IncrementTask(0, 8)); + // Useful for "divide and conquer" problems or tasks that can be executed in parallel + // it allows work stealing where idle threads can steal work from busy ones to maximize efficiency + // Creates threads based on available CPU + ForkJoinPool pool = new ForkJoinPool(2); // very hungry threads, if no work, it'll find it +// pool.getStealCount(); // threads can steal work from each other + Future future = pool.submit(new IncrementTask(0, 8)); // same as ThreadPoolExecutor +// pool.execute(); // same as ThreadPoolExecutor future.get(); @@ -27,12 +31,12 @@ public IncrementTask(int left, int right) { @Override protected void compute() { if (right - left < 3) { - for (int i = left; i < right; i++) { + for (int i = left; i < right; i ++ ) { array[i]++; } } else { int mid = (left + right) / 2; - invokeAll(new IncrementTask(left, mid), new IncrementTask(mid, right)); + invokeAll(new IncrementTask(left, mid), new IncrementTask(mid, right)); // will execute tasks in parallel } } } From 79770a332d607aff2bb6f027a42bed5bf18ee541 Mon Sep 17 00:00:00 2001 From: jeanfern5 Date: Sun, 7 Jul 2024 16:18:22 -0700 Subject: [PATCH 36/40] Completed --- .../6.3/executionHistory/executionHistory.bin | Bin 0 -> 22053 bytes .../executionHistory/executionHistory.lock | Bin 0 -> 17 bytes .../.gradle/6.3/fileChanges/last-build.bin | Bin 0 -> 1 bytes .../.gradle/6.3/fileContent/fileContent.lock | Bin 0 -> 17 bytes .../.gradle/6.3/fileHashes/fileHashes.bin | Bin 0 -> 18647 bytes .../.gradle/6.3/fileHashes/fileHashes.lock | Bin 0 -> 17 bytes .../.gradle/6.3/gc.properties | 0 .../.gradle/6.3/javaCompile/classAnalysis.bin | Bin 0 -> 18929 bytes .../.gradle/6.3/javaCompile/javaCompile.lock | Bin 0 -> 17 bytes .../.gradle/6.3/javaCompile/taskHistory.bin | Bin 0 -> 18679 bytes .../buildOutputCleanup.lock | Bin 0 -> 17 bytes .../buildOutputCleanup/cache.properties | 2 + .../buildOutputCleanup/outputFiles.bin | Bin 0 -> 18857 bytes .../.gradle/checksums/checksums.lock | Bin 0 -> 17 bytes .../.gradle/vcs-1/gc.properties | 0 .../.idea/.gitignore | 3 + .../lecture_9_executors_class/.idea/.name | 1 + .../.idea/codeStyles/Project.xml | 7 + .../.idea/codeStyles/codeStyleConfig.xml | 5 + .../.idea/compiler.xml | 6 + .../.idea/gradle.xml | 17 ++ .../.idea/jarRepositories.xml | 20 ++ .../lecture_9_executors_class/.idea/misc.xml | 5 + .../lecture_9_executors_class/.idea/vcs.xml | 6 + .../lecture_9_executors_class/build.gradle | 14 ++ .../build/classes/java/main/Main.class | Bin 0 -> 1806 bytes .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 58910 bytes .../gradle/wrapper/gradle-wrapper.properties | 5 + chapter_6/lecture_9_executors_class/gradlew | 185 ++++++++++++++++++ .../lecture_9_executors_class/gradlew.bat | 104 ++++++++++ .../lecture_9_executors_class/settings.gradle | 2 + .../src/main/java/Main.java | 29 +++ 32 files changed, 411 insertions(+) create mode 100644 chapter_6/lecture_9_executors_class/.gradle/6.3/executionHistory/executionHistory.bin create mode 100644 chapter_6/lecture_9_executors_class/.gradle/6.3/executionHistory/executionHistory.lock create mode 100644 chapter_6/lecture_9_executors_class/.gradle/6.3/fileChanges/last-build.bin create mode 100644 chapter_6/lecture_9_executors_class/.gradle/6.3/fileContent/fileContent.lock create mode 100644 chapter_6/lecture_9_executors_class/.gradle/6.3/fileHashes/fileHashes.bin create mode 100644 chapter_6/lecture_9_executors_class/.gradle/6.3/fileHashes/fileHashes.lock create mode 100644 chapter_6/lecture_9_executors_class/.gradle/6.3/gc.properties create mode 100644 chapter_6/lecture_9_executors_class/.gradle/6.3/javaCompile/classAnalysis.bin create mode 100644 chapter_6/lecture_9_executors_class/.gradle/6.3/javaCompile/javaCompile.lock create mode 100644 chapter_6/lecture_9_executors_class/.gradle/6.3/javaCompile/taskHistory.bin create mode 100644 chapter_6/lecture_9_executors_class/.gradle/buildOutputCleanup/buildOutputCleanup.lock create mode 100644 chapter_6/lecture_9_executors_class/.gradle/buildOutputCleanup/cache.properties create mode 100644 chapter_6/lecture_9_executors_class/.gradle/buildOutputCleanup/outputFiles.bin create mode 100644 chapter_6/lecture_9_executors_class/.gradle/checksums/checksums.lock create mode 100644 chapter_6/lecture_9_executors_class/.gradle/vcs-1/gc.properties create mode 100644 chapter_6/lecture_9_executors_class/.idea/.gitignore create mode 100644 chapter_6/lecture_9_executors_class/.idea/.name create mode 100644 chapter_6/lecture_9_executors_class/.idea/codeStyles/Project.xml create mode 100644 chapter_6/lecture_9_executors_class/.idea/codeStyles/codeStyleConfig.xml create mode 100644 chapter_6/lecture_9_executors_class/.idea/compiler.xml create mode 100644 chapter_6/lecture_9_executors_class/.idea/gradle.xml create mode 100644 chapter_6/lecture_9_executors_class/.idea/jarRepositories.xml create mode 100644 chapter_6/lecture_9_executors_class/.idea/misc.xml create mode 100644 chapter_6/lecture_9_executors_class/.idea/vcs.xml create mode 100644 chapter_6/lecture_9_executors_class/build.gradle create mode 100644 chapter_6/lecture_9_executors_class/build/classes/java/main/Main.class create mode 100644 chapter_6/lecture_9_executors_class/gradle/wrapper/gradle-wrapper.jar create mode 100644 chapter_6/lecture_9_executors_class/gradle/wrapper/gradle-wrapper.properties create mode 100644 chapter_6/lecture_9_executors_class/gradlew create mode 100644 chapter_6/lecture_9_executors_class/gradlew.bat create mode 100644 chapter_6/lecture_9_executors_class/settings.gradle create mode 100644 chapter_6/lecture_9_executors_class/src/main/java/Main.java diff --git a/chapter_6/lecture_9_executors_class/.gradle/6.3/executionHistory/executionHistory.bin b/chapter_6/lecture_9_executors_class/.gradle/6.3/executionHistory/executionHistory.bin new file mode 100644 index 0000000000000000000000000000000000000000..bc38468c57cdf0d9986bc016628acfa39acd3ae9 GIT binary patch literal 22053 zcmeI%PiP!f90%|>yDdnqx+_*9c<|ss#ho!MX}x%e*@#Bt2GW3diEn3qyF1Cud&7Hg zwrS`|E3J_%v`vK&Q4#SUNU_Bp^kAzup&lyrpdw1}AoipuEmGh7P3qR1Bpv0qu-V!7 z-n{wF=ly0TAq_%?Dp%7N*?8^Q*u*UqKmim$0Te(16hHwKKmim$0Te(16hHwKKmim$ z0Te)i|BJwkK9OC?$qYSMiZ*ULK*&S8^@dS;ZvEHQBRh5`-H(rE|3An+b^HBEAO1uE z6hHwKKmim$0Te(16hHwKKmim$0Te(16hHwKKmim$0Te(16hHwKKmim$0Te(16hHwK zKmim$0Te(16hHwKKmimef+TfWurucG%_9qP6-GPl53n+nHPU2ZD~_j$rivpzu1 zaM3Y4f;t|UG;mEt<-9a)?gy@JnV>y7mTb>9z~+J~a4P-#PVe~s&dXnr3(uNY&b)lV z_*Z7R{U{HV%bBc_vs;Er12vP;TjV;KPMDpJ7!@6Pb3bc!pcQtEd{F!~owQ2c-!eiY z+BF?J!12a42S`Vm@$^qY4?J=#8vxAaj>|gamAqv^0h3yx;R;DsvgS5*y(SwMf(v6g zZ{%XWv@t|~Yi5A&ZJGYDjiCeKU*9}?I-dy(V26sfJRq-LuYa!R$Fwg69#w5F{3`iq zQv%&>W<93M6bME=vjJ@ydMYZhsdTr2H2r)xMtvwBnbU)ZhgT#Ig$+?1Q02B<&s7J@ zFX(nfMF-SC`;y|^8|zY+4VG3OCn@}~PzYdZqUT4s_GkMI1UsHjY4$)w3l;^~xnz4( zN}Z}p@+zQ=aiw!|HYKR)A6~>((i^f zBlV%Jxpw5q99Xm(AmGRT!I<_^bQ zIaa*Bpesi6#mi|JMM&}8c2?6rNW^t@?-R@x;OpyuzkUjuF;}^=cb zJaXmmpGKkcepwXEjPK&3cN|*%<@v+rzS{Y>f1CcyC|JTmTmqGgA1oetD;!#>44pno ze)?qBJJ|!E0}SHdx{~{TGgLvS^1F!fcV+}02q5rJ=;V-NZcuW8Q literal 0 HcmV?d00001 diff --git a/chapter_6/lecture_9_executors_class/.gradle/6.3/executionHistory/executionHistory.lock b/chapter_6/lecture_9_executors_class/.gradle/6.3/executionHistory/executionHistory.lock new file mode 100644 index 0000000000000000000000000000000000000000..853a30ef0d9f90ee727dddc46476ad4804ea2b01 GIT binary patch literal 17 UcmZR+Wq5hQzMjZ71_)3906N(Oy8r+H literal 0 HcmV?d00001 diff --git a/chapter_6/lecture_9_executors_class/.gradle/6.3/fileChanges/last-build.bin b/chapter_6/lecture_9_executors_class/.gradle/6.3/fileChanges/last-build.bin new file mode 100644 index 0000000000000000000000000000000000000000..f76dd238ade08917e6712764a16a22005a50573d GIT binary patch literal 1 IcmZPo000310RR91 literal 0 HcmV?d00001 diff --git a/chapter_6/lecture_9_executors_class/.gradle/6.3/fileContent/fileContent.lock b/chapter_6/lecture_9_executors_class/.gradle/6.3/fileContent/fileContent.lock new file mode 100644 index 0000000000000000000000000000000000000000..c8538c61cc33d67c0823471981c3aea3f7a74f17 GIT binary patch literal 17 TcmZSP>ze*_=8tKX3{U_7HqHci literal 0 HcmV?d00001 diff --git a/chapter_6/lecture_9_executors_class/.gradle/6.3/fileHashes/fileHashes.bin b/chapter_6/lecture_9_executors_class/.gradle/6.3/fileHashes/fileHashes.bin new file mode 100644 index 0000000000000000000000000000000000000000..7fdf4fb2910d3361c2830d89e53db9c4d9ce8ac3 GIT binary patch literal 18647 zcmeI%ze@sP9LMn|B?384BZG5vG*p7<#}ajx5U$4!{THHQ5I2R;R!wQS35Jty4o+84 ze}I$wQBY0M7*Wsh+#%xJ67L6|=lSw|_}uZl*5^aqF&(SZk_rI?5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1pbSFEiV#Nmoc&tzlfg*v98G?+S>V;nDxChoPy7N7pIa;d literal 0 HcmV?d00001 diff --git a/chapter_6/lecture_9_executors_class/.gradle/6.3/fileHashes/fileHashes.lock b/chapter_6/lecture_9_executors_class/.gradle/6.3/fileHashes/fileHashes.lock new file mode 100644 index 0000000000000000000000000000000000000000..4a480545c04cc94fdb5eaae3068343fd5e40b8f2 GIT binary patch literal 17 TcmZR6Db(1czPQMT0Rl7tEvEyr literal 0 HcmV?d00001 diff --git a/chapter_6/lecture_9_executors_class/.gradle/6.3/gc.properties b/chapter_6/lecture_9_executors_class/.gradle/6.3/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/chapter_6/lecture_9_executors_class/.gradle/6.3/javaCompile/classAnalysis.bin b/chapter_6/lecture_9_executors_class/.gradle/6.3/javaCompile/classAnalysis.bin new file mode 100644 index 0000000000000000000000000000000000000000..a65113d99f83338575e6e1ff526667f684be7863 GIT binary patch literal 18929 zcmeI%ze|Ea9LMo9k|Y9!2y8E>Lb16aX~;mbs3<7>l|hux&<~soti7V8KR_H>S{+;h z=cb@2hzA56tp7moc_=ZCtt{${Q04HaQ)Hr=>1D3w}+a=&y7e<@4xHhrIYhZdnKUrIg{6RZbsv0 zuVsBs+2oD*({^ijE2#5vlP3n>(~I}(NqvrOa`Tq?qqD{n0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_Kd{uY>#*PE7eQq8Ma yYR{U8TA9OaE^8gHrjGX2?Og?xt4fdXm#)sLt4II0T|M^x@U8#f^*4=QceMc(xXxPu literal 0 HcmV?d00001 diff --git a/chapter_6/lecture_9_executors_class/.gradle/6.3/javaCompile/javaCompile.lock b/chapter_6/lecture_9_executors_class/.gradle/6.3/javaCompile/javaCompile.lock new file mode 100644 index 0000000000000000000000000000000000000000..28d8228086890f49081a8222c1d3b76cf55edacb GIT binary patch literal 17 UcmZS1cRJv^vT3Oo0|e*+05CTM3IG5A literal 0 HcmV?d00001 diff --git a/chapter_6/lecture_9_executors_class/.gradle/6.3/javaCompile/taskHistory.bin b/chapter_6/lecture_9_executors_class/.gradle/6.3/javaCompile/taskHistory.bin new file mode 100644 index 0000000000000000000000000000000000000000..f62e5195a5c1f1a48a27df5fdc760a69affe9c26 GIT binary patch literal 18679 zcmeI%!Aiq09LMom^df>@guQ}bi6DqqVFwWgyX-vwwtu&3+KnWg;K`fM-~)K{;w$(l zzJV{G>FSsl?;_to+JE{BP4c;>pCrA#&+nG3+y1(wLI42-5I_I{1Q0*~0R#|0009IL zKmY**5I_Kd{~|Do2ifip(>qMtV)rgdj&@?PkzT%kJUwo1b@BPx>i%H$j^7Wuj3)vJ zAb=)+y0iCkyq!<&9%B(>O${LU;S;E%}t>Tb0G`K28|76m^ziBtS4EV zl?}y-wQ94Wn@yZlRT~V%2X(m>?@d0Hc^r&SjMY3ePRFO_swr(@mbu0iIC) ztrAE0>0g<%s6AqT92mX%u~GUGj&LEyZ(ZpIwSduh8D`Vd#F{y>IK%W7-?Ly@flDPtDSQX!qZqy)ZvKC7$kf?ZK@` z(a)|Hr?tPvtNr1x@akOTb*A)m?Y&Ly6(hDhm-K$^`ZkP|-_|#t2q1s}0tg_000Iag zfB*srAbOV literal 0 HcmV?d00001 diff --git a/chapter_6/lecture_9_executors_class/.gradle/checksums/checksums.lock b/chapter_6/lecture_9_executors_class/.gradle/checksums/checksums.lock new file mode 100644 index 0000000000000000000000000000000000000000..5ec1ace333a0046a6e1b333cd4c824fdd58e4f24 GIT binary patch literal 17 TcmZR+esQa@K;z6g3{U_7I57lT literal 0 HcmV?d00001 diff --git a/chapter_6/lecture_9_executors_class/.gradle/vcs-1/gc.properties b/chapter_6/lecture_9_executors_class/.gradle/vcs-1/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/chapter_6/lecture_9_executors_class/.idea/.gitignore b/chapter_6/lecture_9_executors_class/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/chapter_6/lecture_9_executors_class/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/chapter_6/lecture_9_executors_class/.idea/.name b/chapter_6/lecture_9_executors_class/.idea/.name new file mode 100644 index 0000000..fdc1fed --- /dev/null +++ b/chapter_6/lecture_9_executors_class/.idea/.name @@ -0,0 +1 @@ +executor \ No newline at end of file diff --git a/chapter_6/lecture_9_executors_class/.idea/codeStyles/Project.xml b/chapter_6/lecture_9_executors_class/.idea/codeStyles/Project.xml new file mode 100644 index 0000000..919ce1f --- /dev/null +++ b/chapter_6/lecture_9_executors_class/.idea/codeStyles/Project.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/chapter_6/lecture_9_executors_class/.idea/codeStyles/codeStyleConfig.xml b/chapter_6/lecture_9_executors_class/.idea/codeStyles/codeStyleConfig.xml new file mode 100644 index 0000000..a55e7a1 --- /dev/null +++ b/chapter_6/lecture_9_executors_class/.idea/codeStyles/codeStyleConfig.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/chapter_6/lecture_9_executors_class/.idea/compiler.xml b/chapter_6/lecture_9_executors_class/.idea/compiler.xml new file mode 100644 index 0000000..fb7f4a8 --- /dev/null +++ b/chapter_6/lecture_9_executors_class/.idea/compiler.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/chapter_6/lecture_9_executors_class/.idea/gradle.xml b/chapter_6/lecture_9_executors_class/.idea/gradle.xml new file mode 100644 index 0000000..7d3b3e8 --- /dev/null +++ b/chapter_6/lecture_9_executors_class/.idea/gradle.xml @@ -0,0 +1,17 @@ + + + + + + + \ No newline at end of file diff --git a/chapter_6/lecture_9_executors_class/.idea/jarRepositories.xml b/chapter_6/lecture_9_executors_class/.idea/jarRepositories.xml new file mode 100644 index 0000000..fdc392f --- /dev/null +++ b/chapter_6/lecture_9_executors_class/.idea/jarRepositories.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/chapter_6/lecture_9_executors_class/.idea/misc.xml b/chapter_6/lecture_9_executors_class/.idea/misc.xml new file mode 100644 index 0000000..c3df9b0 --- /dev/null +++ b/chapter_6/lecture_9_executors_class/.idea/misc.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/chapter_6/lecture_9_executors_class/.idea/vcs.xml b/chapter_6/lecture_9_executors_class/.idea/vcs.xml new file mode 100644 index 0000000..b2bdec2 --- /dev/null +++ b/chapter_6/lecture_9_executors_class/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/chapter_6/lecture_9_executors_class/build.gradle b/chapter_6/lecture_9_executors_class/build.gradle new file mode 100644 index 0000000..95df5f5 --- /dev/null +++ b/chapter_6/lecture_9_executors_class/build.gradle @@ -0,0 +1,14 @@ +plugins { + id 'java' +} + +group 'org.example' +version '1.0-SNAPSHOT' + +repositories { + mavenCentral() +} + +dependencies { + testCompile group: 'junit', name: 'junit', version: '4.12' +} diff --git a/chapter_6/lecture_9_executors_class/build/classes/java/main/Main.class b/chapter_6/lecture_9_executors_class/build/classes/java/main/Main.class new file mode 100644 index 0000000000000000000000000000000000000000..d6ab259e48021b7ea09688402db3101adc494af5 GIT binary patch literal 1806 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 literal 0 HcmV?d00001 diff --git a/chapter_6/lecture_9_executors_class/gradle/wrapper/gradle-wrapper.properties b/chapter_6/lecture_9_executors_class/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..a4b4429 --- /dev/null +++ b/chapter_6/lecture_9_executors_class/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-6.3-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/chapter_6/lecture_9_executors_class/gradlew b/chapter_6/lecture_9_executors_class/gradlew new file mode 100644 index 0000000..fbd7c51 --- /dev/null +++ b/chapter_6/lecture_9_executors_class/gradlew @@ -0,0 +1,185 @@ +#!/usr/bin/env sh + +# +# Copyright 2015 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=`expr $i + 1` + done + case $i in + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=`save "$@"` + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +exec "$JAVACMD" "$@" diff --git a/chapter_6/lecture_9_executors_class/gradlew.bat b/chapter_6/lecture_9_executors_class/gradlew.bat new file mode 100644 index 0000000..5093609 --- /dev/null +++ b/chapter_6/lecture_9_executors_class/gradlew.bat @@ -0,0 +1,104 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/chapter_6/lecture_9_executors_class/settings.gradle b/chapter_6/lecture_9_executors_class/settings.gradle new file mode 100644 index 0000000..ddfd7d2 --- /dev/null +++ b/chapter_6/lecture_9_executors_class/settings.gradle @@ -0,0 +1,2 @@ +rootProject.name = 'executor' + diff --git a/chapter_6/lecture_9_executors_class/src/main/java/Main.java b/chapter_6/lecture_9_executors_class/src/main/java/Main.java new file mode 100644 index 0000000..25b2f4d --- /dev/null +++ b/chapter_6/lecture_9_executors_class/src/main/java/Main.java @@ -0,0 +1,29 @@ +import java.util.Arrays; +import java.util.concurrent.*; + +public class Main { + // Executors - utility class that allows threads to be created with 1 line of code + // captures common thread creations + public static void main(String[] args) { + // a lot of the thread pools done in previous lectures are available in the "Executors" utility class + ExecutorService executorService = Executors.newFixedThreadPool(5); // creates instance with unbounded queue (non-resizable), uses "LinkedBlockingQueue" + ExecutorService executorService1 = Executors.newCachedThreadPool(new MyThreadFactory()); // handoff mechanism, if no worker available it will create new threads up to max value (~2 billion), uses "SynchronousQueue" + ExecutorService executorService2 = Executors.newWorkStealingPool(); // work stealing pool, uses "ForkJoinPool" + ExecutorService executorService3 = Executors.newSingleThreadExecutor(); + ExecutorService executorService4 = Executors.newSingleThreadScheduledExecutor(); + } + + static class MyThreadFactory implements ThreadFactory { + + @Override + public Thread newThread(Runnable r) { + Thread t = new Thread(r); + + t.setPriority(4); + t.setName("my-thread"); + + return t; + } + } + +} From b2621fee1cd8944d0c4e23689afd0373e974448c Mon Sep 17 00:00:00 2001 From: jeanfern5 Date: Sun, 7 Jul 2024 16:19:25 -0700 Subject: [PATCH 37/40] Completed --- .../lecture_2_threadpools/build.gradle | 0 .../gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 .../lecture_2_threadpools/gradlew | 0 .../lecture_2_threadpools/gradlew.bat | 0 .../lecture_2_threadpools/settings.gradle | 0 .../lecture_2_threadpools/src/main/java/Main.java | 0 .../build.gradle | 0 .../gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 .../gradlew | 0 .../gradlew.bat | 0 .../settings.gradle | 0 .../src/main/java/Main.java | 0 .../build.gradle | 0 .../gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 .../lecture_7_scheduled_threadpool_executor/gradlew | 0 .../gradlew.bat | 0 .../settings.gradle | 0 .../src/main/java/Main.java | 0 .../lecture_8_fork_join_pool/build.gradle | 0 .../gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 .../lecture_8_fork_join_pool/gradlew | 0 .../lecture_8_fork_join_pool/gradlew.bat | 0 .../lecture_8_fork_join_pool/settings.gradle | 0 .../src/main/java/Main.java | 0 .../6.3/executionHistory/executionHistory.bin | Bin .../6.3/executionHistory/executionHistory.lock | Bin .../.gradle/6.3/fileChanges/last-build.bin | Bin .../.gradle/6.3/fileContent/fileContent.lock | Bin .../.gradle/6.3/fileHashes/fileHashes.bin | Bin .../.gradle/6.3/fileHashes/fileHashes.lock | Bin .../.gradle/6.3/gc.properties | 0 .../.gradle/6.3/javaCompile/classAnalysis.bin | Bin .../.gradle/6.3/javaCompile/javaCompile.lock | Bin .../.gradle/6.3/javaCompile/taskHistory.bin | Bin .../buildOutputCleanup/buildOutputCleanup.lock | Bin .../.gradle/buildOutputCleanup/cache.properties | 0 .../.gradle/buildOutputCleanup/outputFiles.bin | Bin .../.gradle/checksums/checksums.lock | Bin .../.gradle/vcs-1/gc.properties | 0 .../lecture_9_executors_class/.idea/.gitignore | 0 .../lecture_9_executors_class/.idea/.name | 0 .../.idea/codeStyles/Project.xml | 0 .../.idea/codeStyles/codeStyleConfig.xml | 0 .../lecture_9_executors_class/.idea/compiler.xml | 0 .../lecture_9_executors_class/.idea/gradle.xml | 0 .../.idea/jarRepositories.xml | 0 .../lecture_9_executors_class/.idea/misc.xml | 0 .../lecture_9_executors_class/.idea/vcs.xml | 0 .../lecture_9_executors_class/build.gradle | 0 .../build/classes/java/main/Main.class | Bin .../gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 .../lecture_9_executors_class/gradlew | 0 .../lecture_9_executors_class/gradlew.bat | 0 .../lecture_9_executors_class/settings.gradle | 0 .../src/main/java/Main.java | 0 60 files changed, 0 insertions(+), 0 deletions(-) rename {chapter_6 => chapter_6_thread_reusability}/lecture_2_threadpools/build.gradle (100%) rename {chapter_6 => chapter_6_thread_reusability}/lecture_2_threadpools/gradle/wrapper/gradle-wrapper.jar (100%) rename {chapter_6 => chapter_6_thread_reusability}/lecture_2_threadpools/gradle/wrapper/gradle-wrapper.properties (100%) rename {chapter_6 => chapter_6_thread_reusability}/lecture_2_threadpools/gradlew (100%) rename {chapter_6 => chapter_6_thread_reusability}/lecture_2_threadpools/gradlew.bat (100%) rename {chapter_6 => chapter_6_thread_reusability}/lecture_2_threadpools/settings.gradle (100%) rename {chapter_6 => chapter_6_thread_reusability}/lecture_2_threadpools/src/main/java/Main.java (100%) rename {chapter_6 => chapter_6_thread_reusability}/lecture_5_managing_rejected_and_monitoring_threads/build.gradle (100%) rename {chapter_6 => chapter_6_thread_reusability}/lecture_5_managing_rejected_and_monitoring_threads/gradle/wrapper/gradle-wrapper.jar (100%) rename {chapter_6 => chapter_6_thread_reusability}/lecture_5_managing_rejected_and_monitoring_threads/gradle/wrapper/gradle-wrapper.properties (100%) rename {chapter_6 => chapter_6_thread_reusability}/lecture_5_managing_rejected_and_monitoring_threads/gradlew (100%) rename {chapter_6 => chapter_6_thread_reusability}/lecture_5_managing_rejected_and_monitoring_threads/gradlew.bat (100%) rename {chapter_6 => chapter_6_thread_reusability}/lecture_5_managing_rejected_and_monitoring_threads/settings.gradle (100%) rename {chapter_6 => chapter_6_thread_reusability}/lecture_5_managing_rejected_and_monitoring_threads/src/main/java/Main.java (100%) rename {chapter_6 => chapter_6_thread_reusability}/lecture_7_scheduled_threadpool_executor/build.gradle (100%) rename {chapter_6 => chapter_6_thread_reusability}/lecture_7_scheduled_threadpool_executor/gradle/wrapper/gradle-wrapper.jar (100%) rename {chapter_6 => chapter_6_thread_reusability}/lecture_7_scheduled_threadpool_executor/gradle/wrapper/gradle-wrapper.properties (100%) rename {chapter_6 => chapter_6_thread_reusability}/lecture_7_scheduled_threadpool_executor/gradlew (100%) rename {chapter_6 => chapter_6_thread_reusability}/lecture_7_scheduled_threadpool_executor/gradlew.bat (100%) rename {chapter_6 => chapter_6_thread_reusability}/lecture_7_scheduled_threadpool_executor/settings.gradle (100%) rename {chapter_6 => chapter_6_thread_reusability}/lecture_7_scheduled_threadpool_executor/src/main/java/Main.java (100%) rename {chapter_6 => chapter_6_thread_reusability}/lecture_8_fork_join_pool/build.gradle (100%) rename {chapter_6 => chapter_6_thread_reusability}/lecture_8_fork_join_pool/gradle/wrapper/gradle-wrapper.jar (100%) rename {chapter_6 => chapter_6_thread_reusability}/lecture_8_fork_join_pool/gradle/wrapper/gradle-wrapper.properties (100%) rename {chapter_6 => chapter_6_thread_reusability}/lecture_8_fork_join_pool/gradlew (100%) rename {chapter_6 => chapter_6_thread_reusability}/lecture_8_fork_join_pool/gradlew.bat (100%) rename {chapter_6 => chapter_6_thread_reusability}/lecture_8_fork_join_pool/settings.gradle (100%) rename {chapter_6 => chapter_6_thread_reusability}/lecture_8_fork_join_pool/src/main/java/Main.java (100%) rename {chapter_6 => chapter_6_thread_reusability}/lecture_9_executors_class/.gradle/6.3/executionHistory/executionHistory.bin (100%) rename {chapter_6 => chapter_6_thread_reusability}/lecture_9_executors_class/.gradle/6.3/executionHistory/executionHistory.lock (100%) rename {chapter_6 => chapter_6_thread_reusability}/lecture_9_executors_class/.gradle/6.3/fileChanges/last-build.bin (100%) rename {chapter_6 => chapter_6_thread_reusability}/lecture_9_executors_class/.gradle/6.3/fileContent/fileContent.lock (100%) rename {chapter_6 => chapter_6_thread_reusability}/lecture_9_executors_class/.gradle/6.3/fileHashes/fileHashes.bin (100%) rename {chapter_6 => chapter_6_thread_reusability}/lecture_9_executors_class/.gradle/6.3/fileHashes/fileHashes.lock (100%) rename {chapter_6 => chapter_6_thread_reusability}/lecture_9_executors_class/.gradle/6.3/gc.properties (100%) rename {chapter_6 => chapter_6_thread_reusability}/lecture_9_executors_class/.gradle/6.3/javaCompile/classAnalysis.bin (100%) rename {chapter_6 => chapter_6_thread_reusability}/lecture_9_executors_class/.gradle/6.3/javaCompile/javaCompile.lock (100%) rename {chapter_6 => chapter_6_thread_reusability}/lecture_9_executors_class/.gradle/6.3/javaCompile/taskHistory.bin (100%) rename {chapter_6 => chapter_6_thread_reusability}/lecture_9_executors_class/.gradle/buildOutputCleanup/buildOutputCleanup.lock (100%) rename {chapter_6 => chapter_6_thread_reusability}/lecture_9_executors_class/.gradle/buildOutputCleanup/cache.properties (100%) rename {chapter_6 => chapter_6_thread_reusability}/lecture_9_executors_class/.gradle/buildOutputCleanup/outputFiles.bin (100%) rename {chapter_6 => chapter_6_thread_reusability}/lecture_9_executors_class/.gradle/checksums/checksums.lock (100%) rename {chapter_6 => chapter_6_thread_reusability}/lecture_9_executors_class/.gradle/vcs-1/gc.properties (100%) rename {chapter_6 => chapter_6_thread_reusability}/lecture_9_executors_class/.idea/.gitignore (100%) rename {chapter_6 => chapter_6_thread_reusability}/lecture_9_executors_class/.idea/.name (100%) rename {chapter_6 => chapter_6_thread_reusability}/lecture_9_executors_class/.idea/codeStyles/Project.xml (100%) rename {chapter_6 => chapter_6_thread_reusability}/lecture_9_executors_class/.idea/codeStyles/codeStyleConfig.xml (100%) rename {chapter_6 => chapter_6_thread_reusability}/lecture_9_executors_class/.idea/compiler.xml (100%) rename {chapter_6 => chapter_6_thread_reusability}/lecture_9_executors_class/.idea/gradle.xml (100%) rename {chapter_6 => chapter_6_thread_reusability}/lecture_9_executors_class/.idea/jarRepositories.xml (100%) rename {chapter_6 => chapter_6_thread_reusability}/lecture_9_executors_class/.idea/misc.xml (100%) rename {chapter_6 => chapter_6_thread_reusability}/lecture_9_executors_class/.idea/vcs.xml (100%) rename {chapter_6 => chapter_6_thread_reusability}/lecture_9_executors_class/build.gradle (100%) rename {chapter_6 => chapter_6_thread_reusability}/lecture_9_executors_class/build/classes/java/main/Main.class (100%) rename {chapter_6 => chapter_6_thread_reusability}/lecture_9_executors_class/gradle/wrapper/gradle-wrapper.jar (100%) rename {chapter_6 => chapter_6_thread_reusability}/lecture_9_executors_class/gradle/wrapper/gradle-wrapper.properties (100%) rename {chapter_6 => chapter_6_thread_reusability}/lecture_9_executors_class/gradlew (100%) rename {chapter_6 => chapter_6_thread_reusability}/lecture_9_executors_class/gradlew.bat (100%) rename {chapter_6 => chapter_6_thread_reusability}/lecture_9_executors_class/settings.gradle (100%) rename {chapter_6 => chapter_6_thread_reusability}/lecture_9_executors_class/src/main/java/Main.java (100%) diff --git a/chapter_6/lecture_2_threadpools/build.gradle b/chapter_6_thread_reusability/lecture_2_threadpools/build.gradle similarity index 100% rename from chapter_6/lecture_2_threadpools/build.gradle rename to chapter_6_thread_reusability/lecture_2_threadpools/build.gradle diff --git a/chapter_6/lecture_2_threadpools/gradle/wrapper/gradle-wrapper.jar b/chapter_6_thread_reusability/lecture_2_threadpools/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from chapter_6/lecture_2_threadpools/gradle/wrapper/gradle-wrapper.jar rename to chapter_6_thread_reusability/lecture_2_threadpools/gradle/wrapper/gradle-wrapper.jar diff --git a/chapter_6/lecture_2_threadpools/gradle/wrapper/gradle-wrapper.properties b/chapter_6_thread_reusability/lecture_2_threadpools/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from chapter_6/lecture_2_threadpools/gradle/wrapper/gradle-wrapper.properties rename to chapter_6_thread_reusability/lecture_2_threadpools/gradle/wrapper/gradle-wrapper.properties diff --git a/chapter_6/lecture_2_threadpools/gradlew b/chapter_6_thread_reusability/lecture_2_threadpools/gradlew similarity index 100% rename from chapter_6/lecture_2_threadpools/gradlew rename to chapter_6_thread_reusability/lecture_2_threadpools/gradlew diff --git a/chapter_6/lecture_2_threadpools/gradlew.bat b/chapter_6_thread_reusability/lecture_2_threadpools/gradlew.bat similarity index 100% rename from chapter_6/lecture_2_threadpools/gradlew.bat rename to chapter_6_thread_reusability/lecture_2_threadpools/gradlew.bat diff --git a/chapter_6/lecture_2_threadpools/settings.gradle b/chapter_6_thread_reusability/lecture_2_threadpools/settings.gradle similarity index 100% rename from chapter_6/lecture_2_threadpools/settings.gradle rename to chapter_6_thread_reusability/lecture_2_threadpools/settings.gradle diff --git a/chapter_6/lecture_2_threadpools/src/main/java/Main.java b/chapter_6_thread_reusability/lecture_2_threadpools/src/main/java/Main.java similarity index 100% rename from chapter_6/lecture_2_threadpools/src/main/java/Main.java rename to chapter_6_thread_reusability/lecture_2_threadpools/src/main/java/Main.java diff --git a/chapter_6/lecture_5_managing_rejected_and_monitoring_threads/build.gradle b/chapter_6_thread_reusability/lecture_5_managing_rejected_and_monitoring_threads/build.gradle similarity index 100% rename from chapter_6/lecture_5_managing_rejected_and_monitoring_threads/build.gradle rename to chapter_6_thread_reusability/lecture_5_managing_rejected_and_monitoring_threads/build.gradle diff --git a/chapter_6/lecture_5_managing_rejected_and_monitoring_threads/gradle/wrapper/gradle-wrapper.jar b/chapter_6_thread_reusability/lecture_5_managing_rejected_and_monitoring_threads/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from chapter_6/lecture_5_managing_rejected_and_monitoring_threads/gradle/wrapper/gradle-wrapper.jar rename to chapter_6_thread_reusability/lecture_5_managing_rejected_and_monitoring_threads/gradle/wrapper/gradle-wrapper.jar diff --git a/chapter_6/lecture_5_managing_rejected_and_monitoring_threads/gradle/wrapper/gradle-wrapper.properties b/chapter_6_thread_reusability/lecture_5_managing_rejected_and_monitoring_threads/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from chapter_6/lecture_5_managing_rejected_and_monitoring_threads/gradle/wrapper/gradle-wrapper.properties rename to chapter_6_thread_reusability/lecture_5_managing_rejected_and_monitoring_threads/gradle/wrapper/gradle-wrapper.properties diff --git a/chapter_6/lecture_5_managing_rejected_and_monitoring_threads/gradlew b/chapter_6_thread_reusability/lecture_5_managing_rejected_and_monitoring_threads/gradlew similarity index 100% rename from chapter_6/lecture_5_managing_rejected_and_monitoring_threads/gradlew rename to chapter_6_thread_reusability/lecture_5_managing_rejected_and_monitoring_threads/gradlew diff --git a/chapter_6/lecture_5_managing_rejected_and_monitoring_threads/gradlew.bat b/chapter_6_thread_reusability/lecture_5_managing_rejected_and_monitoring_threads/gradlew.bat similarity index 100% rename from chapter_6/lecture_5_managing_rejected_and_monitoring_threads/gradlew.bat rename to chapter_6_thread_reusability/lecture_5_managing_rejected_and_monitoring_threads/gradlew.bat diff --git a/chapter_6/lecture_5_managing_rejected_and_monitoring_threads/settings.gradle b/chapter_6_thread_reusability/lecture_5_managing_rejected_and_monitoring_threads/settings.gradle similarity index 100% rename from chapter_6/lecture_5_managing_rejected_and_monitoring_threads/settings.gradle rename to chapter_6_thread_reusability/lecture_5_managing_rejected_and_monitoring_threads/settings.gradle diff --git a/chapter_6/lecture_5_managing_rejected_and_monitoring_threads/src/main/java/Main.java b/chapter_6_thread_reusability/lecture_5_managing_rejected_and_monitoring_threads/src/main/java/Main.java similarity index 100% rename from chapter_6/lecture_5_managing_rejected_and_monitoring_threads/src/main/java/Main.java rename to chapter_6_thread_reusability/lecture_5_managing_rejected_and_monitoring_threads/src/main/java/Main.java diff --git a/chapter_6/lecture_7_scheduled_threadpool_executor/build.gradle b/chapter_6_thread_reusability/lecture_7_scheduled_threadpool_executor/build.gradle similarity index 100% rename from chapter_6/lecture_7_scheduled_threadpool_executor/build.gradle rename to chapter_6_thread_reusability/lecture_7_scheduled_threadpool_executor/build.gradle diff --git a/chapter_6/lecture_7_scheduled_threadpool_executor/gradle/wrapper/gradle-wrapper.jar b/chapter_6_thread_reusability/lecture_7_scheduled_threadpool_executor/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from chapter_6/lecture_7_scheduled_threadpool_executor/gradle/wrapper/gradle-wrapper.jar rename to chapter_6_thread_reusability/lecture_7_scheduled_threadpool_executor/gradle/wrapper/gradle-wrapper.jar diff --git a/chapter_6/lecture_7_scheduled_threadpool_executor/gradle/wrapper/gradle-wrapper.properties b/chapter_6_thread_reusability/lecture_7_scheduled_threadpool_executor/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from chapter_6/lecture_7_scheduled_threadpool_executor/gradle/wrapper/gradle-wrapper.properties rename to chapter_6_thread_reusability/lecture_7_scheduled_threadpool_executor/gradle/wrapper/gradle-wrapper.properties diff --git a/chapter_6/lecture_7_scheduled_threadpool_executor/gradlew b/chapter_6_thread_reusability/lecture_7_scheduled_threadpool_executor/gradlew similarity index 100% rename from chapter_6/lecture_7_scheduled_threadpool_executor/gradlew rename to chapter_6_thread_reusability/lecture_7_scheduled_threadpool_executor/gradlew diff --git a/chapter_6/lecture_7_scheduled_threadpool_executor/gradlew.bat b/chapter_6_thread_reusability/lecture_7_scheduled_threadpool_executor/gradlew.bat similarity index 100% rename from chapter_6/lecture_7_scheduled_threadpool_executor/gradlew.bat rename to chapter_6_thread_reusability/lecture_7_scheduled_threadpool_executor/gradlew.bat diff --git a/chapter_6/lecture_7_scheduled_threadpool_executor/settings.gradle b/chapter_6_thread_reusability/lecture_7_scheduled_threadpool_executor/settings.gradle similarity index 100% rename from chapter_6/lecture_7_scheduled_threadpool_executor/settings.gradle rename to chapter_6_thread_reusability/lecture_7_scheduled_threadpool_executor/settings.gradle diff --git a/chapter_6/lecture_7_scheduled_threadpool_executor/src/main/java/Main.java b/chapter_6_thread_reusability/lecture_7_scheduled_threadpool_executor/src/main/java/Main.java similarity index 100% rename from chapter_6/lecture_7_scheduled_threadpool_executor/src/main/java/Main.java rename to chapter_6_thread_reusability/lecture_7_scheduled_threadpool_executor/src/main/java/Main.java diff --git a/chapter_6/lecture_8_fork_join_pool/build.gradle b/chapter_6_thread_reusability/lecture_8_fork_join_pool/build.gradle similarity index 100% rename from chapter_6/lecture_8_fork_join_pool/build.gradle rename to chapter_6_thread_reusability/lecture_8_fork_join_pool/build.gradle diff --git a/chapter_6/lecture_8_fork_join_pool/gradle/wrapper/gradle-wrapper.jar b/chapter_6_thread_reusability/lecture_8_fork_join_pool/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from chapter_6/lecture_8_fork_join_pool/gradle/wrapper/gradle-wrapper.jar rename to chapter_6_thread_reusability/lecture_8_fork_join_pool/gradle/wrapper/gradle-wrapper.jar diff --git a/chapter_6/lecture_8_fork_join_pool/gradle/wrapper/gradle-wrapper.properties b/chapter_6_thread_reusability/lecture_8_fork_join_pool/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from chapter_6/lecture_8_fork_join_pool/gradle/wrapper/gradle-wrapper.properties rename to chapter_6_thread_reusability/lecture_8_fork_join_pool/gradle/wrapper/gradle-wrapper.properties diff --git a/chapter_6/lecture_8_fork_join_pool/gradlew b/chapter_6_thread_reusability/lecture_8_fork_join_pool/gradlew similarity index 100% rename from chapter_6/lecture_8_fork_join_pool/gradlew rename to chapter_6_thread_reusability/lecture_8_fork_join_pool/gradlew diff --git a/chapter_6/lecture_8_fork_join_pool/gradlew.bat b/chapter_6_thread_reusability/lecture_8_fork_join_pool/gradlew.bat similarity index 100% rename from chapter_6/lecture_8_fork_join_pool/gradlew.bat rename to chapter_6_thread_reusability/lecture_8_fork_join_pool/gradlew.bat diff --git a/chapter_6/lecture_8_fork_join_pool/settings.gradle b/chapter_6_thread_reusability/lecture_8_fork_join_pool/settings.gradle similarity index 100% rename from chapter_6/lecture_8_fork_join_pool/settings.gradle rename to chapter_6_thread_reusability/lecture_8_fork_join_pool/settings.gradle diff --git a/chapter_6/lecture_8_fork_join_pool/src/main/java/Main.java b/chapter_6_thread_reusability/lecture_8_fork_join_pool/src/main/java/Main.java similarity index 100% rename from chapter_6/lecture_8_fork_join_pool/src/main/java/Main.java rename to chapter_6_thread_reusability/lecture_8_fork_join_pool/src/main/java/Main.java diff --git a/chapter_6/lecture_9_executors_class/.gradle/6.3/executionHistory/executionHistory.bin b/chapter_6_thread_reusability/lecture_9_executors_class/.gradle/6.3/executionHistory/executionHistory.bin similarity index 100% rename from chapter_6/lecture_9_executors_class/.gradle/6.3/executionHistory/executionHistory.bin rename to chapter_6_thread_reusability/lecture_9_executors_class/.gradle/6.3/executionHistory/executionHistory.bin diff --git a/chapter_6/lecture_9_executors_class/.gradle/6.3/executionHistory/executionHistory.lock b/chapter_6_thread_reusability/lecture_9_executors_class/.gradle/6.3/executionHistory/executionHistory.lock similarity index 100% rename from chapter_6/lecture_9_executors_class/.gradle/6.3/executionHistory/executionHistory.lock rename to chapter_6_thread_reusability/lecture_9_executors_class/.gradle/6.3/executionHistory/executionHistory.lock diff --git a/chapter_6/lecture_9_executors_class/.gradle/6.3/fileChanges/last-build.bin b/chapter_6_thread_reusability/lecture_9_executors_class/.gradle/6.3/fileChanges/last-build.bin similarity index 100% rename from chapter_6/lecture_9_executors_class/.gradle/6.3/fileChanges/last-build.bin rename to chapter_6_thread_reusability/lecture_9_executors_class/.gradle/6.3/fileChanges/last-build.bin diff --git a/chapter_6/lecture_9_executors_class/.gradle/6.3/fileContent/fileContent.lock b/chapter_6_thread_reusability/lecture_9_executors_class/.gradle/6.3/fileContent/fileContent.lock similarity index 100% rename from chapter_6/lecture_9_executors_class/.gradle/6.3/fileContent/fileContent.lock rename to chapter_6_thread_reusability/lecture_9_executors_class/.gradle/6.3/fileContent/fileContent.lock diff --git a/chapter_6/lecture_9_executors_class/.gradle/6.3/fileHashes/fileHashes.bin b/chapter_6_thread_reusability/lecture_9_executors_class/.gradle/6.3/fileHashes/fileHashes.bin similarity index 100% rename from chapter_6/lecture_9_executors_class/.gradle/6.3/fileHashes/fileHashes.bin rename to chapter_6_thread_reusability/lecture_9_executors_class/.gradle/6.3/fileHashes/fileHashes.bin diff --git a/chapter_6/lecture_9_executors_class/.gradle/6.3/fileHashes/fileHashes.lock b/chapter_6_thread_reusability/lecture_9_executors_class/.gradle/6.3/fileHashes/fileHashes.lock similarity index 100% rename from chapter_6/lecture_9_executors_class/.gradle/6.3/fileHashes/fileHashes.lock rename to chapter_6_thread_reusability/lecture_9_executors_class/.gradle/6.3/fileHashes/fileHashes.lock diff --git a/chapter_6/lecture_9_executors_class/.gradle/6.3/gc.properties b/chapter_6_thread_reusability/lecture_9_executors_class/.gradle/6.3/gc.properties similarity index 100% rename from chapter_6/lecture_9_executors_class/.gradle/6.3/gc.properties rename to chapter_6_thread_reusability/lecture_9_executors_class/.gradle/6.3/gc.properties diff --git a/chapter_6/lecture_9_executors_class/.gradle/6.3/javaCompile/classAnalysis.bin b/chapter_6_thread_reusability/lecture_9_executors_class/.gradle/6.3/javaCompile/classAnalysis.bin similarity index 100% rename from chapter_6/lecture_9_executors_class/.gradle/6.3/javaCompile/classAnalysis.bin rename to chapter_6_thread_reusability/lecture_9_executors_class/.gradle/6.3/javaCompile/classAnalysis.bin diff --git a/chapter_6/lecture_9_executors_class/.gradle/6.3/javaCompile/javaCompile.lock b/chapter_6_thread_reusability/lecture_9_executors_class/.gradle/6.3/javaCompile/javaCompile.lock similarity index 100% rename from chapter_6/lecture_9_executors_class/.gradle/6.3/javaCompile/javaCompile.lock rename to chapter_6_thread_reusability/lecture_9_executors_class/.gradle/6.3/javaCompile/javaCompile.lock diff --git a/chapter_6/lecture_9_executors_class/.gradle/6.3/javaCompile/taskHistory.bin b/chapter_6_thread_reusability/lecture_9_executors_class/.gradle/6.3/javaCompile/taskHistory.bin similarity index 100% rename from chapter_6/lecture_9_executors_class/.gradle/6.3/javaCompile/taskHistory.bin rename to chapter_6_thread_reusability/lecture_9_executors_class/.gradle/6.3/javaCompile/taskHistory.bin diff --git a/chapter_6/lecture_9_executors_class/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/chapter_6_thread_reusability/lecture_9_executors_class/.gradle/buildOutputCleanup/buildOutputCleanup.lock similarity index 100% rename from chapter_6/lecture_9_executors_class/.gradle/buildOutputCleanup/buildOutputCleanup.lock rename to chapter_6_thread_reusability/lecture_9_executors_class/.gradle/buildOutputCleanup/buildOutputCleanup.lock diff --git a/chapter_6/lecture_9_executors_class/.gradle/buildOutputCleanup/cache.properties b/chapter_6_thread_reusability/lecture_9_executors_class/.gradle/buildOutputCleanup/cache.properties similarity index 100% rename from chapter_6/lecture_9_executors_class/.gradle/buildOutputCleanup/cache.properties rename to chapter_6_thread_reusability/lecture_9_executors_class/.gradle/buildOutputCleanup/cache.properties diff --git a/chapter_6/lecture_9_executors_class/.gradle/buildOutputCleanup/outputFiles.bin b/chapter_6_thread_reusability/lecture_9_executors_class/.gradle/buildOutputCleanup/outputFiles.bin similarity index 100% rename from chapter_6/lecture_9_executors_class/.gradle/buildOutputCleanup/outputFiles.bin rename to chapter_6_thread_reusability/lecture_9_executors_class/.gradle/buildOutputCleanup/outputFiles.bin diff --git a/chapter_6/lecture_9_executors_class/.gradle/checksums/checksums.lock b/chapter_6_thread_reusability/lecture_9_executors_class/.gradle/checksums/checksums.lock similarity index 100% rename from chapter_6/lecture_9_executors_class/.gradle/checksums/checksums.lock rename to chapter_6_thread_reusability/lecture_9_executors_class/.gradle/checksums/checksums.lock diff --git a/chapter_6/lecture_9_executors_class/.gradle/vcs-1/gc.properties b/chapter_6_thread_reusability/lecture_9_executors_class/.gradle/vcs-1/gc.properties similarity index 100% rename from chapter_6/lecture_9_executors_class/.gradle/vcs-1/gc.properties rename to chapter_6_thread_reusability/lecture_9_executors_class/.gradle/vcs-1/gc.properties diff --git a/chapter_6/lecture_9_executors_class/.idea/.gitignore b/chapter_6_thread_reusability/lecture_9_executors_class/.idea/.gitignore similarity index 100% rename from chapter_6/lecture_9_executors_class/.idea/.gitignore rename to chapter_6_thread_reusability/lecture_9_executors_class/.idea/.gitignore diff --git a/chapter_6/lecture_9_executors_class/.idea/.name b/chapter_6_thread_reusability/lecture_9_executors_class/.idea/.name similarity index 100% rename from chapter_6/lecture_9_executors_class/.idea/.name rename to chapter_6_thread_reusability/lecture_9_executors_class/.idea/.name diff --git a/chapter_6/lecture_9_executors_class/.idea/codeStyles/Project.xml b/chapter_6_thread_reusability/lecture_9_executors_class/.idea/codeStyles/Project.xml similarity index 100% rename from chapter_6/lecture_9_executors_class/.idea/codeStyles/Project.xml rename to chapter_6_thread_reusability/lecture_9_executors_class/.idea/codeStyles/Project.xml diff --git a/chapter_6/lecture_9_executors_class/.idea/codeStyles/codeStyleConfig.xml b/chapter_6_thread_reusability/lecture_9_executors_class/.idea/codeStyles/codeStyleConfig.xml similarity index 100% rename from chapter_6/lecture_9_executors_class/.idea/codeStyles/codeStyleConfig.xml rename to chapter_6_thread_reusability/lecture_9_executors_class/.idea/codeStyles/codeStyleConfig.xml diff --git a/chapter_6/lecture_9_executors_class/.idea/compiler.xml b/chapter_6_thread_reusability/lecture_9_executors_class/.idea/compiler.xml similarity index 100% rename from chapter_6/lecture_9_executors_class/.idea/compiler.xml rename to chapter_6_thread_reusability/lecture_9_executors_class/.idea/compiler.xml diff --git a/chapter_6/lecture_9_executors_class/.idea/gradle.xml b/chapter_6_thread_reusability/lecture_9_executors_class/.idea/gradle.xml similarity index 100% rename from chapter_6/lecture_9_executors_class/.idea/gradle.xml rename to chapter_6_thread_reusability/lecture_9_executors_class/.idea/gradle.xml diff --git a/chapter_6/lecture_9_executors_class/.idea/jarRepositories.xml b/chapter_6_thread_reusability/lecture_9_executors_class/.idea/jarRepositories.xml similarity index 100% rename from chapter_6/lecture_9_executors_class/.idea/jarRepositories.xml rename to chapter_6_thread_reusability/lecture_9_executors_class/.idea/jarRepositories.xml diff --git a/chapter_6/lecture_9_executors_class/.idea/misc.xml b/chapter_6_thread_reusability/lecture_9_executors_class/.idea/misc.xml similarity index 100% rename from chapter_6/lecture_9_executors_class/.idea/misc.xml rename to chapter_6_thread_reusability/lecture_9_executors_class/.idea/misc.xml diff --git a/chapter_6/lecture_9_executors_class/.idea/vcs.xml b/chapter_6_thread_reusability/lecture_9_executors_class/.idea/vcs.xml similarity index 100% rename from chapter_6/lecture_9_executors_class/.idea/vcs.xml rename to chapter_6_thread_reusability/lecture_9_executors_class/.idea/vcs.xml diff --git a/chapter_6/lecture_9_executors_class/build.gradle b/chapter_6_thread_reusability/lecture_9_executors_class/build.gradle similarity index 100% rename from chapter_6/lecture_9_executors_class/build.gradle rename to chapter_6_thread_reusability/lecture_9_executors_class/build.gradle diff --git a/chapter_6/lecture_9_executors_class/build/classes/java/main/Main.class b/chapter_6_thread_reusability/lecture_9_executors_class/build/classes/java/main/Main.class similarity index 100% rename from chapter_6/lecture_9_executors_class/build/classes/java/main/Main.class rename to chapter_6_thread_reusability/lecture_9_executors_class/build/classes/java/main/Main.class diff --git a/chapter_6/lecture_9_executors_class/gradle/wrapper/gradle-wrapper.jar b/chapter_6_thread_reusability/lecture_9_executors_class/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from chapter_6/lecture_9_executors_class/gradle/wrapper/gradle-wrapper.jar rename to chapter_6_thread_reusability/lecture_9_executors_class/gradle/wrapper/gradle-wrapper.jar diff --git a/chapter_6/lecture_9_executors_class/gradle/wrapper/gradle-wrapper.properties b/chapter_6_thread_reusability/lecture_9_executors_class/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from chapter_6/lecture_9_executors_class/gradle/wrapper/gradle-wrapper.properties rename to chapter_6_thread_reusability/lecture_9_executors_class/gradle/wrapper/gradle-wrapper.properties diff --git a/chapter_6/lecture_9_executors_class/gradlew b/chapter_6_thread_reusability/lecture_9_executors_class/gradlew similarity index 100% rename from chapter_6/lecture_9_executors_class/gradlew rename to chapter_6_thread_reusability/lecture_9_executors_class/gradlew diff --git a/chapter_6/lecture_9_executors_class/gradlew.bat b/chapter_6_thread_reusability/lecture_9_executors_class/gradlew.bat similarity index 100% rename from chapter_6/lecture_9_executors_class/gradlew.bat rename to chapter_6_thread_reusability/lecture_9_executors_class/gradlew.bat diff --git a/chapter_6/lecture_9_executors_class/settings.gradle b/chapter_6_thread_reusability/lecture_9_executors_class/settings.gradle similarity index 100% rename from chapter_6/lecture_9_executors_class/settings.gradle rename to chapter_6_thread_reusability/lecture_9_executors_class/settings.gradle diff --git a/chapter_6/lecture_9_executors_class/src/main/java/Main.java b/chapter_6_thread_reusability/lecture_9_executors_class/src/main/java/Main.java similarity index 100% rename from chapter_6/lecture_9_executors_class/src/main/java/Main.java rename to chapter_6_thread_reusability/lecture_9_executors_class/src/main/java/Main.java From 862583d6ba2825c44cb8cb3ec9443166f4dfc6b3 Mon Sep 17 00:00:00 2001 From: jeanfern5 Date: Sun, 11 Aug 2024 17:43:02 -0700 Subject: [PATCH 38/40] Completed Ch7 - Lecture 1 - Bringing Parallelism to Quick Sort --- .../build.gradle | 0 .../gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 .../gradlew | 0 .../gradlew.bat | 0 .../settings.gradle | 0 .../src/main/java/Main.java | 74 +++++++++--------- 7 files changed, 37 insertions(+), 37 deletions(-) rename chapter_7/{lecture_1 => lecture_1_parallel_quick_sort_threads}/build.gradle (100%) rename chapter_7/{lecture_1 => lecture_1_parallel_quick_sort_threads}/gradle/wrapper/gradle-wrapper.jar (100%) rename chapter_7/{lecture_1 => lecture_1_parallel_quick_sort_threads}/gradle/wrapper/gradle-wrapper.properties (100%) rename chapter_7/{lecture_1 => lecture_1_parallel_quick_sort_threads}/gradlew (100%) rename chapter_7/{lecture_1 => lecture_1_parallel_quick_sort_threads}/gradlew.bat (100%) rename chapter_7/{lecture_1 => lecture_1_parallel_quick_sort_threads}/settings.gradle (100%) rename chapter_7/{lecture_1 => lecture_1_parallel_quick_sort_threads}/src/main/java/Main.java (67%) diff --git a/chapter_7/lecture_1/build.gradle b/chapter_7/lecture_1_parallel_quick_sort_threads/build.gradle similarity index 100% rename from chapter_7/lecture_1/build.gradle rename to chapter_7/lecture_1_parallel_quick_sort_threads/build.gradle diff --git a/chapter_7/lecture_1/gradle/wrapper/gradle-wrapper.jar b/chapter_7/lecture_1_parallel_quick_sort_threads/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from chapter_7/lecture_1/gradle/wrapper/gradle-wrapper.jar rename to chapter_7/lecture_1_parallel_quick_sort_threads/gradle/wrapper/gradle-wrapper.jar diff --git a/chapter_7/lecture_1/gradle/wrapper/gradle-wrapper.properties b/chapter_7/lecture_1_parallel_quick_sort_threads/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from chapter_7/lecture_1/gradle/wrapper/gradle-wrapper.properties rename to chapter_7/lecture_1_parallel_quick_sort_threads/gradle/wrapper/gradle-wrapper.properties diff --git a/chapter_7/lecture_1/gradlew b/chapter_7/lecture_1_parallel_quick_sort_threads/gradlew similarity index 100% rename from chapter_7/lecture_1/gradlew rename to chapter_7/lecture_1_parallel_quick_sort_threads/gradlew diff --git a/chapter_7/lecture_1/gradlew.bat b/chapter_7/lecture_1_parallel_quick_sort_threads/gradlew.bat similarity index 100% rename from chapter_7/lecture_1/gradlew.bat rename to chapter_7/lecture_1_parallel_quick_sort_threads/gradlew.bat diff --git a/chapter_7/lecture_1/settings.gradle b/chapter_7/lecture_1_parallel_quick_sort_threads/settings.gradle similarity index 100% rename from chapter_7/lecture_1/settings.gradle rename to chapter_7/lecture_1_parallel_quick_sort_threads/settings.gradle diff --git a/chapter_7/lecture_1/src/main/java/Main.java b/chapter_7/lecture_1_parallel_quick_sort_threads/src/main/java/Main.java similarity index 67% rename from chapter_7/lecture_1/src/main/java/Main.java rename to chapter_7/lecture_1_parallel_quick_sort_threads/src/main/java/Main.java index 4b7862e..f4f39a9 100644 --- a/chapter_7/lecture_1/src/main/java/Main.java +++ b/chapter_7/lecture_1_parallel_quick_sort_threads/src/main/java/Main.java @@ -1,5 +1,7 @@ import java.util.Random; import java.util.concurrent.ExecutionException; +import java.util.concurrent.ForkJoinPool; +import java.util.concurrent.ForkJoinTask; import java.util.concurrent.RecursiveAction; public class Main { @@ -8,20 +10,6 @@ public class Main { private static int arraySize = 100000000; private static int[] array = new int[arraySize]; - // Fork Join - // Run 1 -> 5.814 seconds - // Run 2 -> 5.504 seconds - // Run 3 -> 5.758 seconds - // Run 4 -> 6.038 seconds - // Run 5 -> 5.495 seconds - - // Classical recursive - // Run 1 -> 10.87 seconds - // Run 2 -> 10.94 seconds - // Run 3 -> 10.77 seconds - // Run 4 -> 10.83 seconds - // Run 5 -> 10.80 seconds - public static void main(String[] args) throws ExecutionException, InterruptedException { for (int i = 0; i < arraySize; i++) { array[i] = random.nextInt(arraySize); @@ -29,28 +17,33 @@ public static void main(String[] args) throws ExecutionException, InterruptedExc // System.out.println(Arrays.toString(array)); - - long start = System.nanoTime(); quickSort(0, arraySize - 1); + // Classical recursive execution + // Run 1 -> 13.223 seconds + // Run 2 -> 12.260 seconds + // Run 3 -> 12.364 seconds + // Run 4 -> 14.279 seconds + // Run 5 -> 12.459 seconds // ForkJoinPool forkJoinPool = new ForkJoinPool(); // ForkJoinTask future = forkJoinPool.submit(new QuickSortTask(0, arraySize - 1)); -// // future.get(); + // Fork Join execution + // Run 1 -> 3.151 seconds + // Run 2 -> 2.857 seconds + // Run 3 -> 2.858 seconds + // Run 4 -> 2.768 seconds + // Run 5 -> 3.509 seconds long end = System.nanoTime(); System.out.println("Execution time = " + (end - start)); - - // System.out.println(Arrays.toString(array)); - } static class QuickSortTask extends RecursiveAction { - private final int left; private final int right; @@ -63,18 +56,34 @@ public QuickSortTask(int left, int right) { protected void compute() { if (left < right) { int pivotIndex = partition(left, right); - invokeAll(new QuickSortTask(left, pivotIndex - 1), - new QuickSortTask(pivotIndex + 1, right)); + + // Fork Join +// invokeAll(new QuickSortTask(left, pivotIndex - 1), +// new QuickSortTask(pivotIndex + 1, right)); + + // Classical recursive + quickSort(left, pivotIndex - 1); + quickSort(pivotIndex + 1, right); } } + + } + + static void quickSort(int left, int right) { + if (left < right) { + int pivotIndex = partition(left, right); + + quickSort(left, pivotIndex - 1); + quickSort(pivotIndex + 1, right); + } } static int partition(int left, int right) { int pivot = array[right]; int swapIndex = left - 1; - for (int i = left; i < right; i++) { - if(array[i] < pivot) { + for (int i = left; i < right; i ++) { + if (array[i] < pivot) { swapIndex++; swap(swapIndex, i); } @@ -82,22 +91,13 @@ static int partition(int left, int right) { swapIndex++; swap(swapIndex, right); - return swapIndex; } - static void quickSort(int left, int right) { - if (left < right) { - int pivotIndex = partition(left, right); - - quickSort(left, pivotIndex - 1); - quickSort(pivotIndex + 1, right); - } - } - static void swap(int leftIndex, int rightIndex) { - int aux = array[leftIndex]; + int temp = array[leftIndex]; array[leftIndex] = array[rightIndex]; - array[rightIndex] = aux; + array[rightIndex] = temp; } + } \ No newline at end of file From 25220c3bc33f8b3e041aa0443bad4b3392f90bf1 Mon Sep 17 00:00:00 2001 From: jeanfern5 Date: Sun, 11 Aug 2024 18:01:29 -0700 Subject: [PATCH 39/40] Completed Ch7 - Lecture 2 - Can We Improve Binary Search Through Multithreading? No --- chapter_7/lecture_2/settings.gradle | 2 -- .../build.gradle | 0 .../gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 .../gradlew | 0 .../gradlew.bat | 0 .../settings.gradle | 2 ++ .../src/main/java/Main.java | 7 +++++++ 8 files changed, 9 insertions(+), 2 deletions(-) delete mode 100644 chapter_7/lecture_2/settings.gradle rename chapter_7/{lecture_2 => lecture_2_binary_search_cannot_parallel}/build.gradle (100%) rename chapter_7/{lecture_2 => lecture_2_binary_search_cannot_parallel}/gradle/wrapper/gradle-wrapper.jar (100%) rename chapter_7/{lecture_2 => lecture_2_binary_search_cannot_parallel}/gradle/wrapper/gradle-wrapper.properties (100%) rename chapter_7/{lecture_2 => lecture_2_binary_search_cannot_parallel}/gradlew (100%) rename chapter_7/{lecture_2 => lecture_2_binary_search_cannot_parallel}/gradlew.bat (100%) create mode 100644 chapter_7/lecture_2_binary_search_cannot_parallel/settings.gradle rename chapter_7/{lecture_2 => lecture_2_binary_search_cannot_parallel}/src/main/java/Main.java (73%) diff --git a/chapter_7/lecture_2/settings.gradle b/chapter_7/lecture_2/settings.gradle deleted file mode 100644 index 6aae90d..0000000 --- a/chapter_7/lecture_2/settings.gradle +++ /dev/null @@ -1,2 +0,0 @@ -rootProject.name = 'parallel-merge-sort' - diff --git a/chapter_7/lecture_2/build.gradle b/chapter_7/lecture_2_binary_search_cannot_parallel/build.gradle similarity index 100% rename from chapter_7/lecture_2/build.gradle rename to chapter_7/lecture_2_binary_search_cannot_parallel/build.gradle diff --git a/chapter_7/lecture_2/gradle/wrapper/gradle-wrapper.jar b/chapter_7/lecture_2_binary_search_cannot_parallel/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from chapter_7/lecture_2/gradle/wrapper/gradle-wrapper.jar rename to chapter_7/lecture_2_binary_search_cannot_parallel/gradle/wrapper/gradle-wrapper.jar diff --git a/chapter_7/lecture_2/gradle/wrapper/gradle-wrapper.properties b/chapter_7/lecture_2_binary_search_cannot_parallel/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from chapter_7/lecture_2/gradle/wrapper/gradle-wrapper.properties rename to chapter_7/lecture_2_binary_search_cannot_parallel/gradle/wrapper/gradle-wrapper.properties diff --git a/chapter_7/lecture_2/gradlew b/chapter_7/lecture_2_binary_search_cannot_parallel/gradlew similarity index 100% rename from chapter_7/lecture_2/gradlew rename to chapter_7/lecture_2_binary_search_cannot_parallel/gradlew diff --git a/chapter_7/lecture_2/gradlew.bat b/chapter_7/lecture_2_binary_search_cannot_parallel/gradlew.bat similarity index 100% rename from chapter_7/lecture_2/gradlew.bat rename to chapter_7/lecture_2_binary_search_cannot_parallel/gradlew.bat diff --git a/chapter_7/lecture_2_binary_search_cannot_parallel/settings.gradle b/chapter_7/lecture_2_binary_search_cannot_parallel/settings.gradle new file mode 100644 index 0000000..e94d8f0 --- /dev/null +++ b/chapter_7/lecture_2_binary_search_cannot_parallel/settings.gradle @@ -0,0 +1,2 @@ +rootProject.name = 'binary-search-cannot-parallel' + diff --git a/chapter_7/lecture_2/src/main/java/Main.java b/chapter_7/lecture_2_binary_search_cannot_parallel/src/main/java/Main.java similarity index 73% rename from chapter_7/lecture_2/src/main/java/Main.java rename to chapter_7/lecture_2_binary_search_cannot_parallel/src/main/java/Main.java index b055d6d..6cb861e 100644 --- a/chapter_7/lecture_2/src/main/java/Main.java +++ b/chapter_7/lecture_2_binary_search_cannot_parallel/src/main/java/Main.java @@ -1,6 +1,13 @@ import java.util.Arrays; public class Main { + /* + Binary search cannot be efficiently parallelized. + + Not everything benefits from parallelization. A deep dive is needed to determine its effectiveness. + For example, in Binary Search, splitting work across threads can be inefficient, + as some threads may return no results. + */ private static int arraySize = 20; private static int numberToSearch = 5; From 53342af7793facec484a0de8a6df5e46ea9efe63 Mon Sep 17 00:00:00 2001 From: jeanfern5 Date: Sun, 11 Aug 2024 18:36:32 -0700 Subject: [PATCH 40/40] Completed Ch7 - Lecture 3 - Parallel Matrix Multiplication - The Naive Way --- chapter_7/lecture_3/src/main/java/Main.java | 227 ------------------ .../build.gradle | 0 .../gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 .../gradlew | 0 .../gradlew.bat | 0 .../settings.gradle | 0 .../src/main/java/Main.java | 114 +++++++++ 8 files changed, 114 insertions(+), 227 deletions(-) delete mode 100644 chapter_7/lecture_3/src/main/java/Main.java rename chapter_7/{lecture_3 => lecture_3_parallel_matrix_multiplication_naive_method}/build.gradle (100%) rename chapter_7/{lecture_3 => lecture_3_parallel_matrix_multiplication_naive_method}/gradle/wrapper/gradle-wrapper.jar (100%) rename chapter_7/{lecture_3 => lecture_3_parallel_matrix_multiplication_naive_method}/gradle/wrapper/gradle-wrapper.properties (100%) rename chapter_7/{lecture_3 => lecture_3_parallel_matrix_multiplication_naive_method}/gradlew (100%) rename chapter_7/{lecture_3 => lecture_3_parallel_matrix_multiplication_naive_method}/gradlew.bat (100%) rename chapter_7/{lecture_3 => lecture_3_parallel_matrix_multiplication_naive_method}/settings.gradle (100%) create mode 100644 chapter_7/lecture_3_parallel_matrix_multiplication_naive_method/src/main/java/Main.java diff --git a/chapter_7/lecture_3/src/main/java/Main.java b/chapter_7/lecture_3/src/main/java/Main.java deleted file mode 100644 index b3efdaf..0000000 --- a/chapter_7/lecture_3/src/main/java/Main.java +++ /dev/null @@ -1,227 +0,0 @@ -import java.util.Random; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.Semaphore; -import java.util.concurrent.TimeUnit; - -public class Main { - private static final int N = 2000; - - private static final Random random = new Random(); - - private static final int[][] A = new int[N][N]; - private static final int[][] B = new int[N][N]; - private static final int[][] C = new int[N][N]; - - // Matrix multiplication results - private static final int[][] result1 = new int[N / 2][N / 2]; - private static final int[][] result2 = new int[N / 2][N / 2]; - private static final int[][] result3 = new int[N / 2][N / 2]; - private static final int[][] result4 = new int[N / 2][N / 2]; - private static final int[][] result5 = new int[N / 2][N / 2]; - private static final int[][] result6 = new int[N / 2][N / 2]; - private static final int[][] result7 = new int[N / 2][N / 2]; - private static final int[][] result8 = new int[N / 2][N / 2]; - - // 1. How many task types do we need to have? -> 2 tasks -> multiplication, a sum - task - // 2. How can we identify the blocks that we need to multiply? - // 3. How can we write the blocks in the output array? - - - // Serial, 2K x 2K - // Run 1 -> 54.48 seconds - // Run 2 -> 54.15 seconds - // Run 3 -> 53.80 seconds - - // Block parallel, 2K x 2K (4 threads) - // Run 1 -> 23.81 seconds - // Run 2 -> 24.20 seconds - // Run 3 -> 25.16 seconds - - - public static void main(String[] args) throws InterruptedException { - initMatrixes(); - -// printMatrix(A); -// printMatrix(B); - - long start = System.nanoTime(); - multiplyParallelPerBlock(); -// multiplySerial(); - long end = System.nanoTime(); - - System.out.println("Execution time = " + (end - start)); - - checkResult(); - -// printMatrix(C); - } - - static void multiplyParallelPerBlock() throws InterruptedException { - ExecutorService executorService = Executors.newFixedThreadPool(8); - - Semaphore semaphore1 = new Semaphore(0); - Semaphore semaphore2 = new Semaphore(0); - Semaphore semaphore3 = new Semaphore(0); - Semaphore semaphore4 = new Semaphore(0); - - // This computes upper-left quadrant - executorService.submit(new BlockMultiplyTask(0, 0, 0, result1, semaphore1)); - executorService.submit(new BlockMultiplyTask(0, 0, N / 2, result2, semaphore1)); - executorService.submit(new SumTask(0, 0, result1, result2, semaphore1)); - - // This computes upper-right quadrant - executorService.submit(new BlockMultiplyTask(0, N / 2, 0, result3, semaphore2)); - executorService.submit(new BlockMultiplyTask(0, N / 2, N / 2, result4, semaphore2)); - executorService.submit(new SumTask(0, N / 2, result3, result4, semaphore2)); - - // This computes bottom-left quadrant - executorService.submit(new BlockMultiplyTask(N / 2, 0, 0, result5, semaphore3)); - executorService.submit(new BlockMultiplyTask(N / 2, 0, N / 2, result6, semaphore3)); - executorService.submit(new SumTask(N / 2, 0, result5, result6, semaphore3)); - - // This computes bottom-right quadrant - executorService.submit(new BlockMultiplyTask(N / 2, N / 2, 0, result7, semaphore4)); - executorService.submit(new BlockMultiplyTask(N / 2, N / 2, N / 2, result8, semaphore4)); - executorService.submit(new SumTask(N / 2, N / 2, result7, result8, semaphore4)); - - executorService.shutdown(); - executorService.awaitTermination(1, TimeUnit.MINUTES); - } - - static class BlockMultiplyTask implements Runnable { - private final int lineStart; - private final int colStart; - private final int blockStart; - private final int[][] result; - private final Semaphore semaphore; - - public BlockMultiplyTask(int lineStart, int colStart, int blockStart, int[][] result, Semaphore semaphore) { - this.lineStart = lineStart; - this.colStart = colStart; - this.blockStart = blockStart; - - this.result = result; - this.semaphore = semaphore; - } - - @Override - public void run() { - for (int i = lineStart, resultX = 0; i < lineStart + N / 2; i++, resultX++) { - for (int j = colStart, resultY = 0; j < colStart + N / 2; j++, resultY++) { - - result[resultX][resultY] = 0; - - for (int k = blockStart; k < blockStart + N / 2; k++) { - result[resultX][resultY] += A[i][k] * B[k][j]; - } - } - } - semaphore.release(); - } - } - - static class SumTask implements Runnable { - private final int lineStart; - private final int colStart; - private final int[][] resultA; - private final int[][] resultB; - private final Semaphore semaphore; - - public SumTask(int lineStart, int colStart, int[][] resultA, int[][] resultB, Semaphore semaphore) { - this.lineStart = lineStart; - this.colStart = colStart; - this.resultA = resultA; - this.resultB = resultB; - this.semaphore = semaphore; - } - - @Override - public void run() { - try { - semaphore.acquire(2); - } catch (InterruptedException e) { - e.printStackTrace(); - } - - for (int i = lineStart, x = 0; i < lineStart + N / 2; i++, x++) { - for (int j = colStart, y= 0; j < colStart + N / 2; j++, y++) { - C[i][j] = resultA[x][y] + resultB[x][y]; - } - } - } - } - - static void multiplyParallel() throws InterruptedException { - ExecutorService threadPool = Executors.newWorkStealingPool(8); - - for (int i = 0; i < N; i++) { - for (int j = 0; j < N; j++) { - threadPool.submit(new MatrixMultiplyTask(i, j)); - } - } - - threadPool.shutdown(); - threadPool.awaitTermination(1, TimeUnit.MINUTES); - } - - static class MatrixMultiplyTask implements Runnable { - - private final int line; - private final int column; - public MatrixMultiplyTask(int line, int column) { - this.line = line; - this.column = column; - } - - @Override - public void run() { - C[line][column] = 0; - for (int i = 0; i < N; i++) { - C[line][column] += A[line][i] * B[i][column]; - } - } - - } - - static void multiplySerial() { - for (int i = 0; i < N; i++) { - for (int j = 0; j < N; j++) { - C[i][j] = 0; - for (int k = 0; k < N; k++) { - C[i][j] += A[i][k] * B[k][j]; - } - } - } - } - - static void initMatrixes() { - for (int i = 0; i < N; i++) { - for (int j = 0; j < N; j++) { - A[i][j] = 1; - B[i][j] = 1; - } - } - } - - static void checkResult() { - for (int i = 0; i < N; i++) { - for (int j = 0; j < N; j++) { - if (C[i][j] != N) { - System.out.println("Incorrect!"); - } - } - } - System.out.println("Correct!"); - } - - static void printMatrix(int[][] matrix) { - for (int i = 0; i < N; i++) { - for (int j = 0; j < N; j++) { - System.out.print(matrix[i][j] + " "); - } - System.out.println(""); - } - System.out.println(""); - } -} diff --git a/chapter_7/lecture_3/build.gradle b/chapter_7/lecture_3_parallel_matrix_multiplication_naive_method/build.gradle similarity index 100% rename from chapter_7/lecture_3/build.gradle rename to chapter_7/lecture_3_parallel_matrix_multiplication_naive_method/build.gradle diff --git a/chapter_7/lecture_3/gradle/wrapper/gradle-wrapper.jar b/chapter_7/lecture_3_parallel_matrix_multiplication_naive_method/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from chapter_7/lecture_3/gradle/wrapper/gradle-wrapper.jar rename to chapter_7/lecture_3_parallel_matrix_multiplication_naive_method/gradle/wrapper/gradle-wrapper.jar diff --git a/chapter_7/lecture_3/gradle/wrapper/gradle-wrapper.properties b/chapter_7/lecture_3_parallel_matrix_multiplication_naive_method/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from chapter_7/lecture_3/gradle/wrapper/gradle-wrapper.properties rename to chapter_7/lecture_3_parallel_matrix_multiplication_naive_method/gradle/wrapper/gradle-wrapper.properties diff --git a/chapter_7/lecture_3/gradlew b/chapter_7/lecture_3_parallel_matrix_multiplication_naive_method/gradlew similarity index 100% rename from chapter_7/lecture_3/gradlew rename to chapter_7/lecture_3_parallel_matrix_multiplication_naive_method/gradlew diff --git a/chapter_7/lecture_3/gradlew.bat b/chapter_7/lecture_3_parallel_matrix_multiplication_naive_method/gradlew.bat similarity index 100% rename from chapter_7/lecture_3/gradlew.bat rename to chapter_7/lecture_3_parallel_matrix_multiplication_naive_method/gradlew.bat diff --git a/chapter_7/lecture_3/settings.gradle b/chapter_7/lecture_3_parallel_matrix_multiplication_naive_method/settings.gradle similarity index 100% rename from chapter_7/lecture_3/settings.gradle rename to chapter_7/lecture_3_parallel_matrix_multiplication_naive_method/settings.gradle diff --git a/chapter_7/lecture_3_parallel_matrix_multiplication_naive_method/src/main/java/Main.java b/chapter_7/lecture_3_parallel_matrix_multiplication_naive_method/src/main/java/Main.java new file mode 100644 index 0000000..57c4389 --- /dev/null +++ b/chapter_7/lecture_3_parallel_matrix_multiplication_naive_method/src/main/java/Main.java @@ -0,0 +1,114 @@ +import java.util.Random; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Semaphore; +import java.util.concurrent.TimeUnit; + +public class Main { + private static final int N = 2000; + + private static final int[][] A = new int[N][N]; // input array + private static final int[][] B = new int[N][N]; // input array + private static final int[][] C = new int[N][N]; // output array + + + public static void main(String[] args) throws InterruptedException { + initMatrixes(); +// printMatrix(A); +// System.out.println(""); +// printMatrix(B); + + long start = System.nanoTime(); + +// multiplySerial(); + // Serial, 2K x 2K + // Run 1 -> 68.91 seconds + // Run 2 -> 68.53 seconds + // Run 3 -> 70.86 seconds + + multiplyParallel(); + // Parallel, 2K x 2K (4 threads) + // Run 1 -> 30.00 seconds + // Run 2 -> 33.13 seconds + // Run 3 -> 36.30 seconds + + long end = System.nanoTime(); + + System.out.println("Execution time = " + (end - start)); + + checkResult(); +// printMatrix(C); + } + + static void multiplyParallel() throws InterruptedException { + ExecutorService service = Executors.newFixedThreadPool(4); + for (int i = 0; i < N; i++) { + for (int j = 0; j < N; j++) { + service.submit(new MatrixMultiplyTask(i, j)); + } + } + + service.shutdown(); + service.awaitTermination(1, TimeUnit.MINUTES); + } + + static class MatrixMultiplyTask implements Runnable { + + private final int line; + private final int col; + + public MatrixMultiplyTask(int line, int col) { + this.line = line; + this.col = col; + } + + @Override + public void run() { + C[line][col] = 0; + for (int k = 0; k < N; k++) { + C[line][col] += A[line][k] * B[k][col]; + } + } + } + + static void multiplySerial() { + for (int i = 0; i < N; i++) { + for (int j = 0; j < N; j++) { + C[i][j] = 0; + for (int k = 0; k < N; k++) { + C[i][j] += A[i][k] * B[k][j]; + } + } + } + } + + static void initMatrixes() { + for (int i = 0; i < N; i++) { + for (int j = 0; j < N; j++) { + A[i][j] = 1; + B[i][j] = 1; + } + } + } + + static void checkResult() { + for (int i = 0; i < N; i++) { + for (int j = 0; j < N; j++) { + if (C[i][j] != N) { + System.out.println("Incorrect!"); + } + } + } + System.out.println("Correct!"); + } + + static void printMatrix(int[][] matrix) { + for (int i = 0; i < N; i++) { + for (int j = 0; j < N; j++) { + System.out.print(matrix[i][j] + " "); + } + System.out.println(); + } + System.out.println(); + } +}