Producer-Consumer Queue
Difficulty: Medium · Topics: Concurrency, Queue, Blocking, Threads
Difficulty: Medium | Tags: Concurrency, Queue, Blocking, Threads
Description
Implement a bounded, thread-safe producer-consumer queue. Producers add items to the queue and consumers take items. If the queue is full, producers block until space is available. If the queue is empty, consumers block until an item is available.
Implement:
BoundedQueue<T>
BoundedQueue(capacity)
produce(item) — blocks if full
consume() → T — blocks if empty
size() → int
isEmpty() → boolean
isFull() → boolean
Examples
queue = new BoundedQueue(3)
// Producer thread:
queue.produce("task1") // queue: ["task1"]
queue.produce("task2") // queue: ["task1", "task2"]
queue.produce("task3") // queue: ["task1", "task2", "task3"]
queue.produce("task4") // BLOCKS — queue is full
// Consumer thread (runs concurrently):
queue.consume() // returns "task1", unblocks producer
// queue: ["task2", "task3", "task4"]
Multi-threaded scenario:
// 2 Producer threads, 3 Consumer threads, capacity = 5
// Producers continuously add work items
// Consumers continuously process items
// System should not deadlock, lose data, or corrupt state
Constraints
1 <= capacity <= 10^4- Multiple producers and consumers must work concurrently.
- Must not deadlock.
- Items are consumed in FIFO order.
- Must handle interruption gracefully.
Hints
Hint 1
Use ReentrantLock with two Conditions: notFull (for producers) and notEmpty (for consumers).
Hint 2
Alternatively, use ArrayBlockingQueue from java.util.concurrent — this problem is about understanding how it works internally.
Follow-up
- Add a
tryProduce(item, timeoutMs)that gives up after a timeout. - Add priority support (highest priority consumed first).
- Add a poison pill mechanism for graceful shutdown.
---
## File / IO