Skip to content

Commit 1b1f174

Browse files
committed
BAEL-7699 Avoid busy-waiting examples
1 parent 42da05e commit 1b1f174

File tree

1 file changed

+78
-0
lines changed
  • core-java-modules/core-java-concurrency-basic-4/src/test/java/com/baeldung/concurrent/busywaiting

1 file changed

+78
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
package com.baeldung.concurrent.busywaiting;
2+
3+
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
import static org.junit.jupiter.api.Assertions.assertTrue;
5+
import static org.junit.jupiter.api.Assertions.fail;
6+
7+
import java.util.concurrent.atomic.AtomicBoolean;
8+
9+
import org.junit.jupiter.api.Test;
10+
import org.slf4j.Logger;
11+
import org.slf4j.LoggerFactory;
12+
13+
public class BusyWaitingUnitTest {
14+
15+
private static final Logger logger = LoggerFactory.getLogger(BusyWaitingUnitTest.class);
16+
17+
@Test
18+
void givenWorkerThread_whenBusyWaiting_thenAssertExecutedMultipleTimes() {
19+
AtomicBoolean taskDone = new AtomicBoolean(false);
20+
int counter = 0;
21+
22+
Thread worker = new Thread(() -> {
23+
simulateThreadWork();
24+
taskDone.set(true);
25+
});
26+
27+
worker.start();
28+
29+
while (!taskDone.get()) {
30+
counter++;
31+
}
32+
33+
logger.info("Counter: {}", counter);
34+
assertTrue(counter > 1);
35+
}
36+
37+
@Test
38+
void givenWorkerThread_whenUsingWaitNotify_thenWaitEfficientlyOnce() {
39+
AtomicBoolean taskDone = new AtomicBoolean(false);
40+
final Object lock = new Object();
41+
int counter = 0;
42+
43+
Thread worker = new Thread(() -> {
44+
simulateThreadWork();
45+
synchronized (lock) {
46+
taskDone.set(true);
47+
lock.notify();
48+
}
49+
});
50+
51+
worker.start();
52+
53+
synchronized (lock) {
54+
while (!taskDone.get()) {
55+
counter++;
56+
try {
57+
lock.wait();
58+
} catch (InterruptedException e) {
59+
Thread.currentThread()
60+
.interrupt();
61+
fail("Test case failed due to thread interruption!");
62+
}
63+
}
64+
}
65+
66+
assertEquals(1, counter);
67+
}
68+
69+
private void simulateThreadWork() {
70+
try {
71+
Thread.sleep(500);
72+
} catch (InterruptedException e) {
73+
Thread.currentThread()
74+
.interrupt();
75+
}
76+
}
77+
78+
}

0 commit comments

Comments
 (0)