Sobes.tech
Middle

Какви механизми предоставя Kotlin за работа с паралелни изчисления?

sobes.tech AI

Отговор от AI

  • Корутини (Coroutines): Леките потоци, които позволяват писане на асинхронен код в императивен стил, като избягват блокиращи извиквания. Основават се на възобновяеми функции и не са свързани с нативни потоци.
  • Dispatchers: Определят потока или пул от потоци, в който ще се изпълнява корутината.
    • Dispatchers.Default: За ресурсоемки задачи (например CPU-bound).
    • Dispatchers.IO: За операции с вход/изход (например мрежови заявки, работа с файлове).
    • Dispatchers.Main: За изпълнение на код в главния поток (например актуализация на UI в Android приложение).
    • Dispatchers.Unconfined: Изпълнява корутината в текущия поток до първия извик на suspend функция.
  • Suspend функции: Функции, които могат да бъдат спирани и възобновени по-късно. Маркират се с модификатора suspend.
  • Context: Съдържа информация за корутината, като диспетчер, job и обработчик на изключения.
  • Job: Представлява жизнения цикъл на корутината (стартирана, активна, завършена, отменена). Позволява управление на корутината (отмяна, изчакване за завършване).
  • Scope: Определя обхвата за корутините, управлявайки техния жизнен цикъл.
  • MutableStateFlow / SharedFlow: В библиотеката kotlinx.coroutines.flow, позволяват безопасен обмен на данни между корутините.
  • Mutex: Примитив за синхронизация за защита на критични секции.
import kotlinx.coroutines.*

fun main() = runBlocking {
    // Пример за използване на корутини и диспетчер
    val job = launch(Dispatchers.Default) {
        repeat(5) { i ->
            println("Работна корутина: $i")
            delay(100) // Не блокиращо забавяне
        }
    }
    println("Започнахме корутината")
    job.join() // Изчакваме завършването на корутината
    println("Корутина завърши")
}
// Пример за suspend функция
suspend fun fetchData(): String {
    delay(1000) // Имитация на мрежов заявка
    return "Данни получени"
}
import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock

val mutex = Mutex()
var counter = 0

suspend fun incrementCounter() {
    mutex.withLock {
        counter++
    }
}