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 |
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.") } } } 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...") } 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.") } |
Este código implementa un patrón de productor-consumidor utilizando hilos en Kotlin. Explicación del código:
- Se crea una cola (
queue
) que se utiliza para almacenar elementos. En este caso, se almacenan números enteros. - Se crea un hilo de productor (
producerThread
) que agrega elementos a la cola. En este ejemplo, agrega los números del 1 al 5. - El hilo del productor sincroniza la cola y agrega elementos a ella. Después de agregar un elemento, simula un retraso con
Thread.sleep(1000)
para simular la producción de elementos. - Se crea un hilo de consumidor (
consumerThread
) que retira elementos de la cola. - El hilo del consumidor sincroniza la cola y verifica si está vacía. Si la cola está vacía, el consumidor entra en un estado de espera utilizando
queue.wait()
. Esto permite que el consumidor espere hasta que el productor agregue elementos a la cola. - Cuando el productor agrega elementos y notifica al consumidor, el consumidor se despierta y retira elementos de la cola utilizando
queue.poll()
. - Los hilos del productor y el consumidor se inician con
producerThread.start()
yconsumerThread.start()
. - Se espera a que ambos hilos terminen con
producerThread.join()
yconsumerThread.join()
. - Finalmente, se imprime «Fin del programa» cuando ambos hilos han terminado de ejecutarse.