def prodConsLargeBuffer(): Unit = {
val buffer: mutable.Queue[Int] = new mutable.Queue[Int]
val capacity = 3
val consumer = new Thread(() => {
val random = new Random()
while (true) {
buffer.synchronized {
if (buffer.isEmpty) {
println("[consumer] buffer empty, waiting...")
buffer.wait()
}
}
// there must be at least one value in the buffer
val x = buffer.dequeue()
println("[consumer] consumed " + x)
// hey producer. there is empty space. Work!
// buffer.notify()
}
Thread.sleep(random.nextInt(500))
})
val producer = new Thread(() => {
val random = new Random()
var i = 0
while (true) {
buffer.synchronized {
if (buffer.size == capacity) {
println("[producer] buffer is full, waiting...")
buffer.wait()
}
println("[producer] producing " + i)
buffer.enqueue(i)
// hey consumer! new food for you
buffer.notify()
i += 1
}
Thread.sleep(random.nextInt(500))
}
})
consumer.start()
producer.start()
}
prodConsLargeBuffer()