I have to solve producent-consumer problem using BlockingQueue. I want it to be 1 element queue. So solution have to be:
Produce 1 Consume 1 Produce 2 Consume 2 Produce 3 Consume 3
But it is:
Produce 1 Produce 2 Consume 1 Consume 2 Produce 3 Produce 4 etc.
I am currently using SynchronizedQueue like this:
class Producent extends Thread {
private final BlockingQueue<Integer> blockingQueue;
public Producent(BlockingQueue<Integer> blockingQueue) {
this.blockingQueue = blockingQueue;
}
@Override
public void run() {
for (int i = 0; i < 100; ++i) {
try {
System.out.println("PRODUCE: " + i);
blockingQueue.put(i);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class Konsument extends Thread {
private final BlockingQueue<Integer> blockingQueue;
public Konsument(BlockingQueue<Integer> blockingQueue) {
this.blockingQueue = blockingQueue;
}
public void run() {
for (int i = 0; i < 100; ++i) {
try {
consume(blockingQueue.take());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
private void consume(int number) {
System.out.println("CONSUME: " + number);
}
}
public class PKmon {
public static void main(String[] args) {
BlockingQueue<Integer> blockingQueue = new SynchronousQueue<>();
Thread producent = new Producent(blockingQueue);
Thread konsument = new Konsument(blockingQueue);
producent.start();
konsument.start();
}
}
What am I doing wrong? I also tried ArrayBlockingQueue and LinkedBlockingQueue.