From 969617681d8884bfb834dd5ab7322838c266fdac Mon Sep 17 00:00:00 2001 From: mahsirat-atiye Date: Thu, 5 Mar 2020 03:06:08 +0330 Subject: [PATCH 1/7] Object Member Variables, check for behavior of static members of a class, when two runnables are running on two different objects. --- .../java/edu/sharif/prj01/NotThreadSafe.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/app/src/main/java/edu/sharif/prj01/NotThreadSafe.java b/app/src/main/java/edu/sharif/prj01/NotThreadSafe.java index 19056ae..b552c9b 100644 --- a/app/src/main/java/edu/sharif/prj01/NotThreadSafe.java +++ b/app/src/main/java/edu/sharif/prj01/NotThreadSafe.java @@ -2,11 +2,17 @@ public class NotThreadSafe{ StringBuilder builder = new StringBuilder(); + static StringBuilder staticBuilder = new StringBuilder(); + public void add(String text){ this.builder.append(text); } + public void addToStaticBuilder(String text){ + staticBuilder.append(text); + } + public static class MyRunnable implements Runnable{ NotThreadSafe instance = null; @@ -18,4 +24,16 @@ public void run(){ this.instance.add("some text"); } } + + public static class MyRunnablePrime implements Runnable{ + NotThreadSafe instance = null; + + public MyRunnablePrime(NotThreadSafe instance){ + this.instance = instance; + } + + public void run(){ + this.instance.addToStaticBuilder("some text"); + } + } } \ No newline at end of file From 6b5a7c0ed119e471ed0b9c9b671ce377414e8d07 Mon Sep 17 00:00:00 2001 From: mahsirat-atiye Date: Thu, 5 Mar 2020 03:45:51 +0330 Subject: [PATCH 2/7] Object Member Variables, check for behavior of static members of a class, when two runnables are running on two different objects. --- .../java/edu/sharif/prj01/MainActivity.java | 34 +++++++++++++++++-- .../java/edu/sharif/prj01/NotThreadSafe.java | 2 +- 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/edu/sharif/prj01/MainActivity.java b/app/src/main/java/edu/sharif/prj01/MainActivity.java index 3c52728..eee2b5a 100644 --- a/app/src/main/java/edu/sharif/prj01/MainActivity.java +++ b/app/src/main/java/edu/sharif/prj01/MainActivity.java @@ -31,19 +31,19 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); - ThreadSubclass(); +// ThreadSubclass(); // ThreadRunnable(); // AnonymousRunnable(); // LambdaRunnable(); // RaceCondition(); // SynchronizedThread(); // ThreadSafeMethod(); -// ObjectMemberVariablesNotThreadSafe(); + ObjectMemberVariablesNotThreadSafe(); // ThreadLocalExampleMethod(); // ReentrantExampleMethod(); // WaitNotifyTest(); // ScheduledExecutorServiceMethod(); - ProducerConsumerExample(); +// ProducerConsumerExample(); // RockPaperScissor(); // javaThreadHandler(); // androidThreadHandler(); @@ -264,6 +264,34 @@ void ObjectMemberVariablesNotThreadSafe() { } Log.i(MainActivity.TAG, "ObjectMemberVariablesNotThreadSafe]]>>" + sharedInstance.builder.toString()); + +// check for static members + NotThreadSafe instance1 = new NotThreadSafe(); + NotThreadSafe instance2 = new NotThreadSafe(); + + Thread t3 = new Thread(new NotThreadSafe.MyRunnablePrime(instance1)); + Thread t4 = new Thread(new NotThreadSafe.MyRunnablePrime(instance2)); + t3.start(); + t4.start(); + try { + t3.join(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + try { + t4.join(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + Log.i(MainActivity.TAG, "ObjectMemberVariablesNotThreadSafeToCheckStaticMembers]]>>" + + " first instance static builder: " + + instance1.staticBuilder.toString() + + " second instance static builder: "+ + instance2.staticBuilder.toString() + + ); + + } void ThreadLocalExampleMethod() { diff --git a/app/src/main/java/edu/sharif/prj01/NotThreadSafe.java b/app/src/main/java/edu/sharif/prj01/NotThreadSafe.java index b552c9b..0440aac 100644 --- a/app/src/main/java/edu/sharif/prj01/NotThreadSafe.java +++ b/app/src/main/java/edu/sharif/prj01/NotThreadSafe.java @@ -1,8 +1,8 @@ package edu.sharif.prj01; public class NotThreadSafe{ - StringBuilder builder = new StringBuilder(); static StringBuilder staticBuilder = new StringBuilder(); + StringBuilder builder = new StringBuilder(); public void add(String text){ From 1f113f5d518635f6d2f79d17e6e6f3906953295d Mon Sep 17 00:00:00 2001 From: mahsirat-atiye Date: Thu, 5 Mar 2020 05:17:48 +0330 Subject: [PATCH 3/7] using shared object as a signaling method between 2 threads & show how they occupy cpu by busy waiting --- .../java/edu/sharif/prj01/BusyWaitSignal.java | 15 ++++++ .../java/edu/sharif/prj01/MainActivity.java | 51 +++++++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 app/src/main/java/edu/sharif/prj01/BusyWaitSignal.java diff --git a/app/src/main/java/edu/sharif/prj01/BusyWaitSignal.java b/app/src/main/java/edu/sharif/prj01/BusyWaitSignal.java new file mode 100644 index 0000000..230aa48 --- /dev/null +++ b/app/src/main/java/edu/sharif/prj01/BusyWaitSignal.java @@ -0,0 +1,15 @@ +package edu.sharif.prj01; + +public class BusyWaitSignal { + protected boolean hasDataToProcess = true; + + + public synchronized boolean hasDataToProcess(){ + return this.hasDataToProcess; + } + + public synchronized void setHasDataToProcess(boolean hasData){ + this.hasDataToProcess = hasData; + } + +} diff --git a/app/src/main/java/edu/sharif/prj01/MainActivity.java b/app/src/main/java/edu/sharif/prj01/MainActivity.java index eee2b5a..49e13c1 100644 --- a/app/src/main/java/edu/sharif/prj01/MainActivity.java +++ b/app/src/main/java/edu/sharif/prj01/MainActivity.java @@ -47,6 +47,57 @@ protected void onCreate(Bundle savedInstanceState) { // RockPaperScissor(); // javaThreadHandler(); // androidThreadHandler(); + busyWaiting(); + } + + private void busyWaiting(){ + BusyWaitSignal sharedSignal = new BusyWaitSignal(); + Thread readerThread = new Thread(new Runnable() { + public void run() { + while(sharedSignal.hasDataToProcess()){ + Log.i(MainActivity.TAG, "Busy Waiting ]]>> " + + + " id: " + Thread.currentThread().getId() + + " is waiting" + ); + } +// doing its job + + } + }); + readerThread.start(); + + Thread writerThread = new Thread(new Runnable() { + public void run() { + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + finally { + sharedSignal.setHasDataToProcess(false); + Log.i(MainActivity.TAG, "Busy Waiting ]]>> " + + + " id: " + Thread.currentThread().getId() + + " finished the job" + ); + } + + } + }); + writerThread.start(); + + try { + readerThread.join(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + try { + writerThread.join(); + } catch (InterruptedException e) { + e.printStackTrace(); + } } private void androidThreadHandler() { From 2adba01391043bd903985f093396aba6463692e2 Mon Sep 17 00:00:00 2001 From: mahsirat-atiye Date: Thu, 5 Mar 2020 06:45:46 +0330 Subject: [PATCH 4/7] using volatile & wait & notify functions on common problem of printing odd & even numbers by 2 threads --- .../java/edu/sharif/prj01/EvenOddPrinter.java | 40 +++++++++++ .../java/edu/sharif/prj01/MainActivity.java | 68 ++++++++++++++++--- 2 files changed, 99 insertions(+), 9 deletions(-) create mode 100644 app/src/main/java/edu/sharif/prj01/EvenOddPrinter.java diff --git a/app/src/main/java/edu/sharif/prj01/EvenOddPrinter.java b/app/src/main/java/edu/sharif/prj01/EvenOddPrinter.java new file mode 100644 index 0000000..c439301 --- /dev/null +++ b/app/src/main/java/edu/sharif/prj01/EvenOddPrinter.java @@ -0,0 +1,40 @@ +package edu.sharif.prj01; + +import android.util.Log; +import static edu.sharif.prj01.MainActivity.TAG; + +public class EvenOddPrinter { + private volatile boolean isOdd; +// use volatile to have last version from main memory + + synchronized void printEven(int number) { + while (!isOdd) { + try { + wait(); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + } + System.out.println(Thread.currentThread().getName() + ":" + number); + Log.i(TAG, "OddEven, print even ]]>>" + + Thread.currentThread().getId() + ":" + number + ); + isOdd = false; + notify(); + } + synchronized void printOdd(int number) { + while (isOdd) { + try { + wait(); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + } + System.out.println(Thread.currentThread().getName() + ":" + number); + Log.i(TAG, "OddEven, print odd ]]>>" + + Thread.currentThread().getId() + ":" + number + ); + isOdd = true; + notify(); + } +} diff --git a/app/src/main/java/edu/sharif/prj01/MainActivity.java b/app/src/main/java/edu/sharif/prj01/MainActivity.java index 49e13c1..a6539af 100644 --- a/app/src/main/java/edu/sharif/prj01/MainActivity.java +++ b/app/src/main/java/edu/sharif/prj01/MainActivity.java @@ -2,7 +2,9 @@ import android.os.Handler; import android.os.HandlerThread; + import androidx.appcompat.app.AppCompatActivity; + import android.os.Bundle; import android.util.Log; @@ -12,7 +14,9 @@ import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; - +// +//import edu.sharif.prj01.even_odd_numbers.Printer; +//import edu.sharif.prj01.even_odd_numbers.TaskEvenOdd; import edu.sharif.prj01.producer_consumer.Buffer; import edu.sharif.prj01.producer_consumer.ConsumerRunnable; import edu.sharif.prj01.producer_consumer.ProducerRunnable; @@ -38,7 +42,7 @@ protected void onCreate(Bundle savedInstanceState) { // RaceCondition(); // SynchronizedThread(); // ThreadSafeMethod(); - ObjectMemberVariablesNotThreadSafe(); +// ObjectMemberVariablesNotThreadSafe(); // ThreadLocalExampleMethod(); // ReentrantExampleMethod(); // WaitNotifyTest(); @@ -47,14 +51,61 @@ protected void onCreate(Bundle savedInstanceState) { // RockPaperScissor(); // javaThreadHandler(); // androidThreadHandler(); - busyWaiting(); +// busyWaiting(); + evenOdd(); + + } + + private void evenOdd() { + EvenOddPrinter evenOddPrinter = new EvenOddPrinter(); + Thread threadOdd = new Thread(new Runnable() { + public void run() { + int number = 1; + while (number <= 10) { + evenOddPrinter.printOdd(number); + + number += 2; + } + + } + }); + threadOdd.start(); + + Thread threadEven = new Thread(new Runnable() { + public void run() { + int number = 2; + while (number <= 10) { + evenOddPrinter.printEven(number); + + number += 2; + } + + } + }); + threadEven.start(); +// =========== + + + try { + threadOdd.join(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + try { + threadEven.join(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + +// Log.i(MainActivity.TAG, "EvenOdd finished task!]]>> " ); } - private void busyWaiting(){ + private void busyWaiting() { BusyWaitSignal sharedSignal = new BusyWaitSignal(); Thread readerThread = new Thread(new Runnable() { public void run() { - while(sharedSignal.hasDataToProcess()){ + while (sharedSignal.hasDataToProcess()) { Log.i(MainActivity.TAG, "Busy Waiting ]]>> " + " id: " + Thread.currentThread().getId() @@ -73,8 +124,7 @@ public void run() { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); - } - finally { + } finally { sharedSignal.setHasDataToProcess(false); Log.i(MainActivity.TAG, "Busy Waiting ]]>> " + @@ -115,7 +165,7 @@ public void run() { public void javaThreadHandler() { T t = new T(); t.start(); - while(t.handler == null) { + while (t.handler == null) { synchronized (t) { try { t.wait(); @@ -337,7 +387,7 @@ void ObjectMemberVariablesNotThreadSafe() { Log.i(MainActivity.TAG, "ObjectMemberVariablesNotThreadSafeToCheckStaticMembers]]>>" + " first instance static builder: " + instance1.staticBuilder.toString() + - " second instance static builder: "+ + " second instance static builder: " + instance2.staticBuilder.toString() ); From 8a498895587957673a8792804982d3f4e199e69a Mon Sep 17 00:00:00 2001 From: mahsirat-atiye Date: Thu, 5 Mar 2020 06:51:59 +0330 Subject: [PATCH 5/7] refactor --- app/src/main/java/edu/sharif/prj01/MainActivity.java | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/app/src/main/java/edu/sharif/prj01/MainActivity.java b/app/src/main/java/edu/sharif/prj01/MainActivity.java index a6539af..1100cad 100644 --- a/app/src/main/java/edu/sharif/prj01/MainActivity.java +++ b/app/src/main/java/edu/sharif/prj01/MainActivity.java @@ -14,9 +14,7 @@ import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; -// -//import edu.sharif.prj01.even_odd_numbers.Printer; -//import edu.sharif.prj01.even_odd_numbers.TaskEvenOdd; + import edu.sharif.prj01.producer_consumer.Buffer; import edu.sharif.prj01.producer_consumer.ConsumerRunnable; import edu.sharif.prj01.producer_consumer.ProducerRunnable; @@ -83,8 +81,6 @@ public void run() { } }); threadEven.start(); -// =========== - try { threadOdd.join(); @@ -98,7 +94,6 @@ public void run() { e.printStackTrace(); } -// Log.i(MainActivity.TAG, "EvenOdd finished task!]]>> " ); } private void busyWaiting() { From 0bc893f0e121caacef9db6c3533bbc957be03fa6 Mon Sep 17 00:00:00 2001 From: SabrinehM Date: Thu, 5 Mar 2020 11:31:12 +0330 Subject: [PATCH 6/7] Check_Thread_Functions_New --- app/src/main/java/edu/sharif/prj01/MainActivity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/edu/sharif/prj01/MainActivity.java b/app/src/main/java/edu/sharif/prj01/MainActivity.java index 1100cad..a572c13 100644 --- a/app/src/main/java/edu/sharif/prj01/MainActivity.java +++ b/app/src/main/java/edu/sharif/prj01/MainActivity.java @@ -33,7 +33,7 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); -// ThreadSubclass(); + ThreadSubclass(); // ThreadRunnable(); // AnonymousRunnable(); // LambdaRunnable(); From a753b2a7ea18b6bf0bb15ae46e7683c4ed71213d Mon Sep 17 00:00:00 2001 From: SabrinehM Date: Thu, 5 Mar 2020 11:46:30 +0330 Subject: [PATCH 7/7] Check_Thread_Functions_New2 --- app/src/main/java/edu/sharif/prj01/MainActivity.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/edu/sharif/prj01/MainActivity.java b/app/src/main/java/edu/sharif/prj01/MainActivity.java index a572c13..e592c47 100644 --- a/app/src/main/java/edu/sharif/prj01/MainActivity.java +++ b/app/src/main/java/edu/sharif/prj01/MainActivity.java @@ -33,9 +33,9 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); - ThreadSubclass(); +// ThreadSubclass(); // ThreadRunnable(); -// AnonymousRunnable(); + AnonymousRunnable(); // LambdaRunnable(); // RaceCondition(); // SynchronizedThread();