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

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

---

## File / IO

Practice this problem

Related problems