Skip to content

Commit 03f5301

Browse files
authored
Multiple threads odd-even refactor (eugenp#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
1 parent 8232be4 commit 03f5301

File tree

2 files changed

+29
-41
lines changed

2 files changed

+29
-41
lines changed

core-java-concurrency/src/main/java/com/baeldung/concurrent/evenandodd/SemaphoreDemo.java renamed to core-java-concurrency/src/main/java/com/baeldung/concurrent/evenandodd/PrintEvenOddSemaphore.java

Lines changed: 15 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -2,55 +2,47 @@
22

33
import java.util.concurrent.Semaphore;
44

5-
public class SemaphoreDemo {
5+
public class PrintEvenOddSemaphore {
66

77
public static void main(String[] args) {
8-
98
SharedPrinter sp = new SharedPrinter();
10-
Thread odd = new Thread(new Odd(sp, 10));
11-
odd.setName("Odd");
12-
Thread even = new Thread(new Even(sp, 10));
13-
even.setName("Even");
9+
Thread odd = new Thread(new Odd(sp, 10), "Odd");
10+
Thread even = new Thread(new Even(sp, 10), "Even");
1411

1512
odd.start();
1613
even.start();
17-
1814
}
19-
2015
}
2116

2217
class SharedPrinter {
2318

24-
Semaphore semEven = new Semaphore(0);
25-
Semaphore semOdd = new Semaphore(1);
19+
private final Semaphore semEven = new Semaphore(0);
20+
private final Semaphore semOdd = new Semaphore(1);
2621

27-
public void printEvenNum(int num) {
22+
void printEvenNum(int num) {
2823
try {
2924
semEven.acquire();
3025
} catch (InterruptedException e) {
31-
e.printStackTrace();
26+
Thread.currentThread().interrupt();
3227
}
33-
System.out.println(Thread.currentThread()
34-
.getName() + ":"+num);
28+
System.out.println(Thread.currentThread().getName() + ":"+num);
3529
semOdd.release();
3630
}
3731

38-
public void printOddNum(int num) {
32+
void printOddNum(int num) {
3933
try {
4034
semOdd.acquire();
4135
} catch (InterruptedException e) {
42-
e.printStackTrace();
36+
Thread.currentThread().interrupt();
4337
}
44-
System.out.println(Thread.currentThread()
45-
.getName() + ":"+ num);
38+
System.out.println(Thread.currentThread().getName() + ":"+ num);
4639
semEven.release();
47-
4840
}
4941
}
5042

5143
class Even implements Runnable {
52-
SharedPrinter sp;
53-
int max;
44+
private final SharedPrinter sp;
45+
private final int max;
5446

5547
Even(SharedPrinter sp, int max) {
5648
this.sp = sp;
@@ -66,8 +58,8 @@ public void run() {
6658
}
6759

6860
class Odd implements Runnable {
69-
SharedPrinter sp;
70-
int max;
61+
private SharedPrinter sp;
62+
private int max;
7163

7264
Odd(SharedPrinter sp, int max) {
7365
this.sp = sp;

core-java-concurrency/src/main/java/com/baeldung/concurrent/evenandodd/PrintEvenOdd.java renamed to core-java-concurrency/src/main/java/com/baeldung/concurrent/evenandodd/PrintEvenOddWaitNotify.java

Lines changed: 14 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,20 @@
11
package com.baeldung.concurrent.evenandodd;
22

3-
public class PrintEvenOdd {
3+
public class PrintEvenOddWaitNotify {
44

55
public static void main(String... args) {
66
Printer print = new Printer();
7-
Thread t1 = new Thread(new TaskEvenOdd(print, 10, false));
8-
t1.setName("Odd");
9-
Thread t2 = new Thread(new TaskEvenOdd(print, 10, true));
10-
t2.setName("Even");
7+
Thread t1 = new Thread(new TaskEvenOdd(print, 10, false), "Odd");
8+
Thread t2 = new Thread(new TaskEvenOdd(print, 10, true), "Even");
119
t1.start();
1210
t2.start();
1311
}
1412
}
1513

1614
class TaskEvenOdd implements Runnable {
17-
private int max;
18-
private Printer print;
19-
private boolean isEvenNumber;
15+
private final int max;
16+
private final Printer print;
17+
private final boolean isEvenNumber;
2018

2119
TaskEvenOdd(Printer print, int max, boolean isEvenNumber) {
2220
this.print = print;
@@ -26,7 +24,7 @@ class TaskEvenOdd implements Runnable {
2624

2725
@Override
2826
public void run() {
29-
int number = isEvenNumber == true ? 2 : 1;
27+
int number = isEvenNumber ? 2 : 1;
3028
while (number <= max) {
3129
if (isEvenNumber) {
3230
print.printEven(number);
@@ -39,32 +37,30 @@ public void run() {
3937
}
4038

4139
class Printer {
42-
boolean isOdd = false;
40+
private volatile boolean isOdd;
4341

4442
synchronized void printEven(int number) {
45-
while (isOdd == false) {
43+
while (!isOdd) {
4644
try {
4745
wait();
4846
} catch (InterruptedException e) {
49-
e.printStackTrace();
47+
Thread.currentThread().interrupt();
5048
}
5149
}
52-
System.out.println(Thread.currentThread()
53-
.getName() + ":" + number);
50+
System.out.println(Thread.currentThread().getName() + ":" + number);
5451
isOdd = false;
5552
notify();
5653
}
5754

5855
synchronized void printOdd(int number) {
59-
while (isOdd == true) {
56+
while (isOdd) {
6057
try {
6158
wait();
6259
} catch (InterruptedException e) {
63-
e.printStackTrace();
60+
Thread.currentThread().interrupt();
6461
}
6562
}
66-
System.out.println(Thread.currentThread()
67-
.getName() + ":" + number);
63+
System.out.println(Thread.currentThread().getName() + ":" + number);
6864
isOdd = true;
6965
notify();
7066
}

0 commit comments

Comments
 (0)