So in this post I will solve this producer consumer problem by using Blocking Queue in java.
Before that I will give a quick introduction of Blocking Queue.
Blocking Queue is an interface locate in java concurrent package.It mainly support operations that wait for the queue to become non empty when retrieving and removing element and wait for space become available when adding an element. All the blocking queue implementation are thread-safe and methods are atomic.
In this demo I will use ArrayBlockingQueue as the implementation of BlockQueue.
So first we create domain model for this demo.
Message.java
package rd.domain;
public class Message {
private String description;
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}
then we create Producer.java
create 100 message and finish message and add in to the queue.
package rd.concurent;
import rd.domain.Message;
import java.util.concurrent.BlockingQueue;
public class Producer implements Runnable {
private BlockingQueue<Message> queue;
public Producer(BlockingQueue<Message> queue) {
this.queue = queue;
}
@Override
public void run() {
// create messages and adding to queue
for (int i = 1; i <= 100; i++) {
Message message = new Message();
message.setDescription(" Message " + i);
try {
Thread.sleep(i);
queue.put(message);
System.out.println("Produced " + message.getDescription());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// adding exit message
Message message = new Message();
message.setDescription("finish");
try {
queue.put(message);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
Consumer.java
package rd.concurent;
import rd.domain.Message;
import java.util.concurrent.BlockingQueue;
public class Consumer implements Runnable {
private BlockingQueue<Message> queue;
public Consumer(BlockingQueue<Message> queue) {
this.queue = queue;
}
@Override
public void run() {
Message message = null;
try {
while (!(message = queue.take()).getDescription().endsWith("finish")){
Thread.sleep(10);
System.out.println("Consumed " + message.getDescription());
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
So the basic implementation are done. Now its time to test it. Here I create Main.java and create producer consumer thread and start those threads.
Main.java
package rd;
import rd.concurent.Consumer;
import rd.concurent.Producer;
import rd.domain.Message;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
public class Main {
public static void main(String[] args) {
BlockingQueue<Message> blockingQueue = new ArrayBlockingQueue<>(10);
Producer producer = new Producer(blockingQueue);
Consumer consumer = new Consumer(blockingQueue);
new Thread(consumer).start();
new Thread(producer).start();
System.out.println("Started.................");
}
}
So that's it. We just solved the producer consumer problem.
Hi, but JMS queue/topic doesn't already solve the consumer/producer problem out of the box? thanks.
ReplyDeleteGreat Article
ReplyDeleteOnline Java Training | Java EE course | Java Course in Chennai | Java Training in Chennai | Java Training Institutes in Chennai | J2EE Training in Chennai | java j2ee training institutes in chennai
Java Training in Chennai
ReplyDeleteOnline MVC Training India | Angularjs Training | Java Training in Chennai |
Java Training in CHennai | Java Training in CHennai
just information we only provide information for those who need it cara menggugurkan hamil
ReplyDeleteA. cara agar cepat hamil setelah selesai haid
B. cara agar cepat hamil
C. cara alami untuk segera mendapat kehamilan
D. makanan dan minuman agar cepat hamil
E. masa subur biar cepat hamil
F. panduan agar cepat hamil
ReplyDeleteYour content is excellent but with pics and videos,
this blog could certainly be one of the best in its field.
Excellent blog!kajal hot
your blog' s design is simple and clean and i like it. Your blog posts about Online writing Help are superb. Please keep them coming. Greets!
ReplyDeleteOnline Training for Big Data
best Apache Spark online course