Skip to content

Latest commit

 

History

History
160 lines (107 loc) · 6.4 KB

File metadata and controls

160 lines (107 loc) · 6.4 KB

Многопоточность


Thread

Поток — это наименьшая единица выполнения в процессе. Каждое приложение имеет хотя бы один поток (главный поток, или MainThread). Потоки позволяют выполнять задачи параллельно.

MainThread (Главный поток)

Главный поток (MainThread) — это поток, в котором работает UI приложения. Все операции, связанные с интерфейсом (например, обновление текста в TextView), должны выполняться в главном потоке.

Особенности:

  • Если блокировать главный поток (например, выполняя долгую операцию), приложение зависнет (ANRApplication Not Responding).
  • Долгие операции (например, загрузка данных из сети) должны выполняться в фоновых потоках.

Многопоточность

Многопоточность — это возможность выполнять несколько потоков одновременно. Это позволяет:

  • Не блокировать главный поток.
  • Улучшить производительность приложения.
  • Выполнять задачи параллельно.

Многопоточность в Kotlin

Kotlin предоставляет несколько способов работы с многопоточностью:

  • Потоки (Thread).
  • Корутины (Coroutines).
  • Executors и ThreadPool.
  • Handler и Looper.

Потоки (Thread)

Создание потока

Поток можно создать с помощью класса Thread.

val thread = Thread {
    // Логика, выполняемая в фоновом потоке
    println("Running in background thread")
}
thread.start()

Проблемы с потоками

  • Сложность управления: - Потоки сложно синхронизировать и управлять ими.
  • Ресурсоемкость: - Создание большого количества потоков может привести к утечкам памяти и снижению производительности.

Корутины (Coroutines)

Корутины — это легковесные потоки, которые упрощают асинхронное программирование. Они позволяют писать асинхронный код в синхронном стиле.

Основные преимущества:

  • Легковесность: - Корутины используют меньше ресурсов, чем потоки.
  • Упрощение кода: - Код с корутинами выглядит как синхронный, что делает его более читаемым.
  • Отмена задач: - Корутины поддерживают отмену задач.

Пример использования корутин

import kotlinx.coroutines.*

fun main() {
    // Запуск корутины
    GlobalScope.launch {
        // Фоновая задача
        val result = doBackgroundWork()
        // Обновление UI (в главном потоке)
        withContext(Dispatchers.Main) {
            println("Result: $result")
        }
    }
}

suspend fun doBackgroundWork(): String {
    delay(1000) // Имитация долгой задачи
    return "Work done"
}

Dispatchers (Диспетчеры)

Диспетчеры определяют, в каком потоке будет выполняться корутина:

  • Dispatchers.Main — Главный поток (для работы с UI).
  • Dispatchers.IO — Для операций ввода-вывода (например, работа с сетью или файлами).
  • Dispatchers.Default — Для CPU-интенсивных задач (например, сортировка данных).

Executors и ThreadPool

Executors — это высокоуровневый API для управления пулом потоков. Он позволяет эффективно выполнять задачи в фоновых потоках.

Пример использования Executors

val executor = Executors.newFixedThreadPool(4) // Создание пула из 4 потоков

executor.execute {
    // Логика, выполняемая в фоновом потоке
    println("Running in background thread")
}

executor.shutdown() // Завершение работы пула

Handler и Looper

Handler и Looper — это механизмы для работы с потоками в Android. Они позволяют отправлять задачи в конкретный поток (например, главный поток).

Пример использования Handler и Looper

val handler = Handler(Looper.getMainLooper()) // Создание Handler для главного потока

handler.post {
    // Логика, выполняемая в главном потоке
    println("Running in main thread")
}

Краткое

  • Thread — Наименьшая единица выполнения. Главный поток (MainThread) отвечает за UI.
  • Многопоточность — Позволяет выполнять задачи параллельно, не блокируя главный поток.
  • Корутины — Легковесные потоки, которые упрощают асинхронное программирование.
  • Dispatchers — Определяют, в каком потоке будет выполняться корутина.
  • Executors — Высокоуровневый API для управления пулом потоков.
  • Handler и Looper — Механизмы для работы с потоками в Android.