Skip to content

Commit 58f8e61

Browse files
ramansahasimaibin
authored andcommitted
BAEL-1327 Java Threads: notify and wait (initial commit) (eugenp#3160)
1 parent a8bbb67 commit 58f8e61

5 files changed

Lines changed: 165 additions & 0 deletions

File tree

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package com.baeldung.concurrent.waitandnotify;
2+
3+
public class Data {
4+
private String packet;
5+
6+
// True if receiver should wait
7+
// False if sender should wait
8+
private boolean transfer = true;
9+
10+
public synchronized String receive() {
11+
while (transfer) {
12+
try {
13+
wait();
14+
} catch (InterruptedException e) {}
15+
}
16+
transfer = true;
17+
18+
notifyAll();
19+
return packet;
20+
}
21+
22+
public synchronized void send(String packet) {
23+
while (!transfer) {
24+
try {
25+
wait();
26+
} catch (InterruptedException e) {}
27+
}
28+
transfer = false;
29+
30+
this.packet = packet;
31+
notifyAll();
32+
}
33+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.baeldung.concurrent.waitandnotify;
2+
3+
public class NetworkDriver {
4+
public static void main(String[] args) {
5+
Data data = new Data();
6+
Thread sender = new Thread(new Sender(data));
7+
Thread receiver = new Thread(new Receiver(data));
8+
9+
sender.start();
10+
receiver.start();
11+
}
12+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package com.baeldung.concurrent.waitandnotify;
2+
3+
import java.util.concurrent.ThreadLocalRandom;
4+
5+
public class Receiver implements Runnable {
6+
private Data load;
7+
8+
public Receiver(Data load) {
9+
this.load = load;
10+
}
11+
12+
public void run() {
13+
for(String receivedMessage = load.receive();
14+
!"End".equals(receivedMessage) ;
15+
receivedMessage = load.receive()) {
16+
17+
System.out.println(receivedMessage);
18+
19+
//Thread.sleep() to mimic heavy server-side processing
20+
try {
21+
Thread.sleep(ThreadLocalRandom.current().nextInt(1000, 5000));
22+
} catch (InterruptedException e) {}
23+
}
24+
}
25+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package com.baeldung.concurrent.waitandnotify;
2+
3+
import java.util.concurrent.ThreadLocalRandom;
4+
5+
public class Sender implements Runnable {
6+
private Data data;
7+
8+
public Sender(Data data) {
9+
this.data = data;
10+
}
11+
12+
public void run() {
13+
String packets[] = {
14+
"First packet",
15+
"Second packet",
16+
"Third packet",
17+
"Fourth packet",
18+
"End"
19+
};
20+
21+
for (String packet : packets) {
22+
data.send(packet);
23+
24+
//Thread.sleep() to mimic heavy server-side processing
25+
try {
26+
Thread.sleep(ThreadLocalRandom.current().nextInt(1000, 5000));
27+
} catch (InterruptedException e) {}
28+
}
29+
}
30+
}
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package com.baeldung.concurrent.waitandnotify;
2+
3+
import static org.junit.Assert.assertEquals;
4+
5+
import java.io.ByteArrayOutputStream;
6+
import java.io.PrintStream;
7+
import java.io.PrintWriter;
8+
import java.io.StringWriter;
9+
10+
import org.junit.After;
11+
import org.junit.Before;
12+
import org.junit.Test;
13+
14+
public class NetworkIntegrationTest {
15+
16+
private final ByteArrayOutputStream outContent = new ByteArrayOutputStream();
17+
private final ByteArrayOutputStream errContent = new ByteArrayOutputStream();
18+
private String expected;
19+
20+
@Before
21+
public void setUpStreams() {
22+
System.setOut(new PrintStream(outContent));
23+
System.setErr(new PrintStream(errContent));
24+
}
25+
26+
@Before
27+
public void setUpExpectedOutput() {
28+
StringWriter expectedStringWriter = new StringWriter();
29+
30+
PrintWriter printWriter = new PrintWriter(expectedStringWriter);
31+
printWriter.println("First packet");
32+
printWriter.println("Second packet");
33+
printWriter.println("Third packet");
34+
printWriter.println("Fourth packet");
35+
printWriter.close();
36+
37+
expected = expectedStringWriter.toString();
38+
}
39+
40+
@After
41+
public void cleanUpStreams() {
42+
System.setOut(null);
43+
System.setErr(null);
44+
}
45+
46+
@Test
47+
public void givenSenderAndReceiver_whenSendingPackets_thenNetworkSynchronized() {
48+
Data data = new Data();
49+
Thread sender = new Thread(new Sender(data));
50+
Thread receiver = new Thread(new Receiver(data));
51+
52+
sender.start();
53+
receiver.start();
54+
55+
//wait for sender and receiver to finish before we test against expected
56+
try {
57+
sender.join();
58+
receiver.join();
59+
} catch (InterruptedException e) {
60+
e.printStackTrace();
61+
}
62+
63+
assertEquals(expected, outContent.toString());
64+
}
65+
}

0 commit comments

Comments
 (0)