Что такое поток?android-24

Поток (Thread) — это наименьшая единица выполнения внутри процесса, позволяющая выполнять задачи параллельно. В Android потоки играют критически важную роль для обеспечения отзывчивости UI.

Основные характеристики потоков

  1. Отношение к процессу

    • Каждый процесс содержит хотя бы один поток (главный/UI-поток)
    • Потоки внутри процесса разделяют:
      // Общая память процесса
      static int sharedCounter = 0;
      
    • Но имеют:
      // Собственный стек вызовов
      void threadMethod() {
          int localVar = 42; // Локальная переменная потока
      }
      
  2. Главный поток (UI Thread)

    • Создается системой автоматически
    • Отвечает за:
      • Обработку событий UI
      • Обновление View элементов
      • Взаимодействие с компонентами Android

Создание и управление потоками

  1. Базовый способ (Thread class)

    Thread {
        // Долгая операция
        val result = doNetworkCall()
    
        // Обновление UI (НЕПРАВИЛЬНО из фонового потока)
        textView.text = result // Вызовет NetworkOnMainThreadException
    }.start()
    
  2. Правильное обновление UI

    Thread {
        val result = doNetworkCall()
    
        runOnUiThread {
            textView.text = result // Корректное обновление
        }
    }.start()
    

Современные подходы

  1. Корутины

    viewModelScope.launch {
        // IO поток (автоматическое переключение)
        val data = withContext(Dispatchers.IO) {
            repository.fetchData()
        }
    
        // Возврат в Main поток
        updateUi(data)
    }
    
  2. Executors и ThreadPools

    val executor = Executors.newFixedThreadPool(4)
    executor.execute {
        // Параллельное выполнение
    }
    

Ключевые проблемы потоков

  1. Синхронизация

    @Synchronized
    fun safeIncrement() {
        counter++ // Потокобезопасный метод
    }
    
  2. Состояния гонки (Race Conditions)

    • Решение: использование Mutex, Atomic переменных
  3. Взаимоблокировки (Deadlocks)

    • Когда потоки блокируют друг друга

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

  1. StrictMode

    • Обнаруживает операции на UI потоке:
      • Сетевые вызовы
      • Операции с диском
  2. ANR (Application Not Responding)

    • Возникает при блокировке UI потока >5 сек
  3. Handler/Looper

    val handler = Handler(Looper.getMainLooper())
    handler.post {
        // Код выполнится на главном потоке
    }
    

Резюмируем:

потоки в Android — это механизм параллельного выполнения кода, где главный поток отвечает за UI, а фоновые — за тяжелые операции. Современные приложения используют корутины или RxJava для упрощения работы с потоками, избегая блокировок UI и ANR ошибок.