Middle
¿Qué elementos de multitarea proporciona Kotlin?
sobes.tech AI
Respuesta de la IA
Kotlin proporciona los siguientes elementos de concurrencia:
- Corutinas: Hilos ligeros basados en funciones suspendidas. Permiten la ejecución asíncrona y no bloqueante del código.
- Constructores de corutinas: Funciones que inician corutinas. Los principales son:
launch(inicia una corutina sin devolver valor),async(inicia una corutina y devuelve unDeferred, que puede ser esperado para obtener el resultado).// Ejemplo de uso de launch GlobalScope.launch { println("Hola desde la corutina ${Thread.currentThread().name}") } // Ejemplo de uso de async val deferred = GlobalScope.async { delay(1000) // Simula una operación larga "Resultado" } val result = runBlocking { deferred.await() } // Espera el resultado Dispatchers: Determinan en qué grupo de hilos se ejecutará la corutina. Los principales son:Dispatchers.Default: Grupo de hilos general para tareas intensivas en CPU.Dispatchers.IO: Grupo de hilos para operaciones de entrada/salida bloqueantes (trabajo con archivos, red).Dispatchers.Main: Dispatcher para el hilo de la interfaz de usuario en plataformas correspondientes (Android, Swing).Dispatchers.Unconfined: La corutina se inicia en el hilo actual, pero puede reanudarse en cualquier hilo.
GlobalScope.launch(Dispatchers.IO) { // Ejecución de entrada/salida }runBlocking: Función constructor de corutinas que bloquea el hilo actual hasta que la corutina finalice. Se usa para combinar código bloqueante y no bloqueante, a menudo en pruebas o funciones main.runBlocking { launch { delay(500) println("Finalizado en ${Thread.currentThread().name}") } println("Iniciado en ${Thread.currentThread().name}") }- Funciones
suspend: Funciones cuyo ejecución puede ser suspendida y reanudada. Solo pueden ser llamadas desde otras funcionessuspendo constructores de corutinas.suspend fun doSomething() { delay(100) // Ejemplo de suspensión } Job: Handle para una corutina en ejecución. Proporciona métodos para gestionar el ciclo de vida de la corutina (cancelar, esperar a que termine).val job = GlobalScope.launch { // Operación larga } job.cancel() // Cancela la corutina runBlocking { job.join() } // Espera a que termineCoroutineScope: Define un ámbito para las corutinas. Las corutinas lanzadas en un ámbito determinado se cancelan automáticamente al cancelar el ámbito. Ayuda a gestionar el ciclo de vida de las corutinas.val scope = CoroutineScope(Dispatchers.Default) scope.launch { // Corutina en este ámbito } scope.cancel() // Cancela todas las corutinas en este ámbito- Canales (
Channel): Primitive para la transmisión segura de datos entre corutinas. Los canales pueden ser unidireccionales (solo enviar o recibir) o bidireccionales.import kotlinx.coroutines.channels.Channel val channel = Channel<Int>() runBlocking { launch { for (x in 1..5) channel.send(x * x) channel.close() // Es importante cerrar el canal } launch { for (y in channel) println(y) } } - Mutex (
Mutex): Primitive de sincronización para garantizar acceso exclusivo a un recurso compartido. Garantiza seguridad en hilos, permitiendo que solo una corutina tenga el mutex en un momento dado.import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock val mutex = Mutex() var counter = 0 suspend fun incrementCounter() { mutex.withLock { counter++ } } - Estados (
StateFlow,SharedFlow): Primitive para trabajar con flujos de datos en el contexto de programación reactiva y concurrencia.StateFlowrepresenta un flujo "frío" con el estado actual, ySharedFlowun flujo "caliente" para difusión de datos.