В чем разница между Thread (поток) и Queue (очередь) в iOS?

«В чем разница между Thread (поток) и Queue (очередь) в iOS?» — вопрос из категории Многопоточность, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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), а не управлять потоками напрямую. Это безопаснее, эффективнее и проще.