Поток — это наименьшая единица выполнения в процессе.
Каждое приложение имеет хотя бы один поток (главный поток, или MainThread
).
Потоки позволяют выполнять задачи параллельно.
Главный поток (MainThread) — это поток, в котором работает UI
приложения.
Все операции, связанные с интерфейсом (например, обновление текста в TextView
), должны выполняться в главном потоке.
Особенности:
- Если блокировать главный поток (например, выполняя долгую операцию), приложение зависнет (
ANR
—Application Not Responding
). - Долгие операции (например, загрузка данных из сети) должны выполняться в фоновых потоках.
Многопоточность — это возможность выполнять несколько потоков одновременно. Это позволяет:
- Не блокировать главный поток.
- Улучшить производительность приложения.
- Выполнять задачи параллельно.
Kotlin
предоставляет несколько способов работы с многопоточностью:
- Потоки (
Thread
). - Корутины (
Coroutines
). - Executors и
ThreadPool
. - Handler и Looper.
Поток можно создать с помощью класса Thread.
val thread = Thread {
// Логика, выполняемая в фоновом потоке
println("Running in background thread")
}
thread.start()
- Сложность управления: - Потоки сложно синхронизировать и управлять ими.
- Ресурсоемкость: - Создание большого количества потоков может привести к утечкам памяти и снижению производительности.
Корутины — это легковесные потоки, которые упрощают асинхронное программирование. Они позволяют писать асинхронный код в синхронном стиле.
- Легковесность: - Корутины используют меньше ресурсов, чем потоки.
- Упрощение кода: - Код с корутинами выглядит как синхронный, что делает его более читаемым.
- Отмена задач: - Корутины поддерживают отмену задач.
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.Main — Главный поток (для работы с
UI
). - Dispatchers.IO — Для операций ввода-вывода (например, работа с сетью или файлами).
- Dispatchers.Default — Для
CPU
-интенсивных задач (например, сортировка данных).
Executors — это высокоуровневый API
для управления пулом потоков.
Он позволяет эффективно выполнять задачи в фоновых потоках.
val executor = Executors.newFixedThreadPool(4) // Создание пула из 4 потоков
executor.execute {
// Логика, выполняемая в фоновом потоке
println("Running in background thread")
}
executor.shutdown() // Завершение работы пула
Handler и Looper — это механизмы для работы с потоками в Android
.
Они позволяют отправлять задачи в конкретный поток (например, главный поток).
val handler = Handler(Looper.getMainLooper()) // Создание Handler для главного потока
handler.post {
// Логика, выполняемая в главном потоке
println("Running in main thread")
}
- Thread — Наименьшая единица выполнения. Главный поток (
MainThread
) отвечает заUI
. - Многопоточность — Позволяет выполнять задачи параллельно, не блокируя главный поток.
- Корутины — Легковесные потоки, которые упрощают асинхронное программирование.
- Dispatchers — Определяют, в каком потоке будет выполняться корутина.
- Executors — Высокоуровневый API для управления пулом потоков.
- Handler и Looper — Механизмы для работы с потоками в
Android
.