En este ejemplo, el hilo del productor agrega elementos a la cola, mientras que el hilo del consumidor los retira de la cola. Hemos utilizado sincronización (synchronized
) para garantizar que ambos hilos no accedan a la cola al mismo tiempo y para evitar condiciones de carrera. Además, utilizamos wait()
y notify()
para permitir que el consumidor espere si la cola está vacía y notificar al consumidor cuando el productor agrega un elemento a la cola.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | import java.util.LinkedList import java.util.Queue fun main() { val queue: Queue<Int> = LinkedList() val producerThread = Thread { for (i in 1..5) { synchronized(queue) { queue.add(i) println("Productor: Agregó el elemento $i a la cola.") // Simulamos un retraso en la producción Thread.sleep(1000) } } } val consumerThread = Thread { for (i in 1..5) { synchronized(queue) { while (queue.isEmpty()) { // Esperar si la cola está vacía try { println("Consumidor: La cola está vacía, esperando...") queue.wait() } catch (e: InterruptedException) { e.printStackTrace() } } val element = queue.poll() println("Consumidor: Retiró el elemento $element de la cola.") } } } // Iniciar los hilos producerThread.start() consumerThread.start() // Esperar a que ambos hilos terminen producerThread.join() consumerThread.join() println("Fin del programa.") } |