Ответ
Thread (поток) — это низкоуровневая единица выполнения, управляемая операционной системой. Потоки выполняются параллельно и разделяют память процесса.
Queue (очередь) — это абстракция высокого уровня (часть Grand Central Dispatch, GCD), которая управляет пулом потоков за вас. Задачи отправляются в очередь, а система решает, на каком потоке их выполнить.
Основные различия:
| Параметр | Thread | Queue (GCD) |
|---|---|---|
| Уровень абстракции | Низкий, ближе к ОС. | Высокий, абстракция над потоками. |
| Управление | Ручное: создание, запуск, остановка, синхронизация. Сложно и подвержено ошибкам (гонки, deadlock). | Автоматическое. Система управляет созданием и переиспользованием потоков в пуле. |
| Типы | Просто поток. | Serial (последовательная) – задачи выполняются по одной. Concurrent (параллельная) – задачи могут выполняться одновременно. |
| Эффективность | Создание потока — дорогая операция. | Очереди используют общий пул потоков, что эффективнее. |
| Безопасность | Требует ручной синхронизации доступа к общим данным (с помощью locks, семафоров). | DispatchQueue предоставляет механизмы для безопасного выполнения кода (например, sync, барьеры). |
Примеры кода:
Прямая работа с потоком (не рекомендуется для обычных задач):
let customThread = Thread {
print("Выполняюсь на отдельном потоке: (Thread.current)")
}
customThread.start()
Работа через очередь (предпочтительный способ):
// Последовательная очередь
let serialQueue = DispatchQueue(label: "com.example.serial")
serialQueue.async {
print("Задача 1")
}
// Параллельная очередь
let concurrentQueue = DispatchQueue(label: "com.example.concurrent", attributes: .concurrent)
concurrentQueue.async {
print("Задача может выполняться параллельно")
}
// Глобальная системная очередь
DispatchQueue.global(qos: .background).async {
// Фоновая задача
DispatchQueue.main.async {
// Обновление UI на главном потоке
}
}
Вывод: В iOS разработке почти всегда следует использовать очереди (GCD), а не управлять потоками напрямую. Это безопаснее, эффективнее и проще.