Multiple threads odd-even refactor (#5617)

* encoding

* Converting synchronous and asynchronous API to observables

* Adding different ways of converting sync/async APIs to observalbles.

* Replace anonymous class with lambda

* update based on comment from Grzegorz Piwowarek

* Refactor even-odd semaphore demo

* Remove unrelated files
This commit is contained in:
Grzegorz Piwowarek 2018-11-10 12:22:48 +01:00 committed by GitHub
parent 8232be4841
commit 03f530126f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 29 additions and 41 deletions

View File

@ -2,55 +2,47 @@ package com.baeldung.concurrent.evenandodd;
import java.util.concurrent.Semaphore; import java.util.concurrent.Semaphore;
public class SemaphoreDemo { public class PrintEvenOddSemaphore {
public static void main(String[] args) { public static void main(String[] args) {
SharedPrinter sp = new SharedPrinter(); SharedPrinter sp = new SharedPrinter();
Thread odd = new Thread(new Odd(sp, 10)); Thread odd = new Thread(new Odd(sp, 10), "Odd");
odd.setName("Odd"); Thread even = new Thread(new Even(sp, 10), "Even");
Thread even = new Thread(new Even(sp, 10));
even.setName("Even");
odd.start(); odd.start();
even.start(); even.start();
} }
} }
class SharedPrinter { class SharedPrinter {
Semaphore semEven = new Semaphore(0); private final Semaphore semEven = new Semaphore(0);
Semaphore semOdd = new Semaphore(1); private final Semaphore semOdd = new Semaphore(1);
public void printEvenNum(int num) { void printEvenNum(int num) {
try { try {
semEven.acquire(); semEven.acquire();
} catch (InterruptedException e) { } catch (InterruptedException e) {
e.printStackTrace(); Thread.currentThread().interrupt();
} }
System.out.println(Thread.currentThread() System.out.println(Thread.currentThread().getName() + ":"+num);
.getName() + ":"+num);
semOdd.release(); semOdd.release();
} }
public void printOddNum(int num) { void printOddNum(int num) {
try { try {
semOdd.acquire(); semOdd.acquire();
} catch (InterruptedException e) { } catch (InterruptedException e) {
e.printStackTrace(); Thread.currentThread().interrupt();
} }
System.out.println(Thread.currentThread() System.out.println(Thread.currentThread().getName() + ":"+ num);
.getName() + ":"+ num);
semEven.release(); semEven.release();
} }
} }
class Even implements Runnable { class Even implements Runnable {
SharedPrinter sp; private final SharedPrinter sp;
int max; private final int max;
Even(SharedPrinter sp, int max) { Even(SharedPrinter sp, int max) {
this.sp = sp; this.sp = sp;
@ -66,8 +58,8 @@ class Even implements Runnable {
} }
class Odd implements Runnable { class Odd implements Runnable {
SharedPrinter sp; private SharedPrinter sp;
int max; private int max;
Odd(SharedPrinter sp, int max) { Odd(SharedPrinter sp, int max) {
this.sp = sp; this.sp = sp;

View File

@ -1,22 +1,20 @@
package com.baeldung.concurrent.evenandodd; package com.baeldung.concurrent.evenandodd;
public class PrintEvenOdd { public class PrintEvenOddWaitNotify {
public static void main(String... args) { public static void main(String... args) {
Printer print = new Printer(); Printer print = new Printer();
Thread t1 = new Thread(new TaskEvenOdd(print, 10, false)); Thread t1 = new Thread(new TaskEvenOdd(print, 10, false), "Odd");
t1.setName("Odd"); Thread t2 = new Thread(new TaskEvenOdd(print, 10, true), "Even");
Thread t2 = new Thread(new TaskEvenOdd(print, 10, true));
t2.setName("Even");
t1.start(); t1.start();
t2.start(); t2.start();
} }
} }
class TaskEvenOdd implements Runnable { class TaskEvenOdd implements Runnable {
private int max; private final int max;
private Printer print; private final Printer print;
private boolean isEvenNumber; private final boolean isEvenNumber;
TaskEvenOdd(Printer print, int max, boolean isEvenNumber) { TaskEvenOdd(Printer print, int max, boolean isEvenNumber) {
this.print = print; this.print = print;
@ -26,7 +24,7 @@ class TaskEvenOdd implements Runnable {
@Override @Override
public void run() { public void run() {
int number = isEvenNumber == true ? 2 : 1; int number = isEvenNumber ? 2 : 1;
while (number <= max) { while (number <= max) {
if (isEvenNumber) { if (isEvenNumber) {
print.printEven(number); print.printEven(number);
@ -39,32 +37,30 @@ class TaskEvenOdd implements Runnable {
} }
class Printer { class Printer {
boolean isOdd = false; private volatile boolean isOdd;
synchronized void printEven(int number) { synchronized void printEven(int number) {
while (isOdd == false) { while (!isOdd) {
try { try {
wait(); wait();
} catch (InterruptedException e) { } catch (InterruptedException e) {
e.printStackTrace(); Thread.currentThread().interrupt();
} }
} }
System.out.println(Thread.currentThread() System.out.println(Thread.currentThread().getName() + ":" + number);
.getName() + ":" + number);
isOdd = false; isOdd = false;
notify(); notify();
} }
synchronized void printOdd(int number) { synchronized void printOdd(int number) {
while (isOdd == true) { while (isOdd) {
try { try {
wait(); wait();
} catch (InterruptedException e) { } catch (InterruptedException e) {
e.printStackTrace(); Thread.currentThread().interrupt();
} }
} }
System.out.println(Thread.currentThread() System.out.println(Thread.currentThread().getName() + ":" + number);
.getName() + ":" + number);
isOdd = true; isOdd = true;
notify(); notify();
} }