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:
parent
8232be4841
commit
03f530126f
|
@ -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;
|
|
@ -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();
|
||||||
}
|
}
|
Loading…
Reference in New Issue