Назад к вопросам
Middle
106
questionbank
Какие механизмы предоставляет Kotlin для работы с параллельными вычислениями?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
- Корутины (Coroutines): Легковесные потоки, которые позволяют писать асинхронный код в императивном стиле, избегая блокирующих вызовов. Основаны на возобновляемых функциях и не привязаны к нативным потокам.
- Dispatchers: Определяют поток или пул потоков, в котором будет выполняться корутина.
Dispatchers.Default: Для ресурсоемких задач (например, CPU-bound).Dispatchers.IO: Для I/O операций (например, сетевые запросы, работа с файлами).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++
}
}