Producer Consumer example
a simple producer-consumer scenario where one thread (Producer) produces data and
another thread (Consumer) consumes it. The wait(), notify(), and notifyAll() methods are used
for communication between the threads.
class Data {
private String packet;
private boolean transfer = true;
// Synchronized method to send data
public synchronized void send(String packet) {
while (!transfer) {
try {
wait();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
System.out.println("Thread interrupted");
}
}
transfer = false;
this.packet = packet;
notifyAll();
}
// Synchronized method to receive data
public synchronized String receive() {
while (transfer) {
try {
wait();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
System.out.println("Thread interrupted");
}
}
transfer = true;
notifyAll();
return packet;
}
}
class Sender implements Runnable {
private Data data;
public Sender(Data data) {
this.data = data;
}
@Override
public void run() {
String packets[] = {
"First packet",
"Second packet",
"Third packet",
"Fourth packet",
"End"
};
for (String packet : packets) {
data.send(packet);
System.out.println("Sending " + packet);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
System.out.println("Thread interrupted");
}
}
}
}
class Receiver implements Runnable
{
private Data data;
public Receiver(Data data) {
this.data = data;
}
@Override
public void run() {
for (String receivedMessage = data.receive();
!"End".equals(receivedMessage);
receivedMessage = data.receive()) {
System.out.println("Received: " + receivedMessage);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
System.out.println("Thread interrupted");
}
}
}
}
public class ProducerConsumer {
public static void main(String[] args) {
Data data = new Data();
Thread sender = new Thread(new Sender(data));
Thread receiver = new Thread(new Receiver(data));
sender.start();
receiver.start();
}
}
Received: First packet
Sending First packet
Sending Second packet
Received: Second packet
Sending Third packet
Received: Third packet
Sending Fourth packet
Received: Fourth packet
Sending End