Что происходит с потоком, когда он выполняет IO-операцию и понимает, что нужно ожидать

«Что происходит с потоком, когда он выполняет IO-операцию и понимает, что нужно ожидать» — вопрос из категории Многопоточность, который задают на 23% собеседований Android Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

При выполнении IO-операции (чтение файла, сетевой запрос и т.д.) поток блокируется до получения данных. В Android это может привести к ANR, если операция выполняется на UI-потоке.

Рекомендуемые подходы:

  1. Kotlin Coroutines - с suspend функциями и Dispatchers.IO:
viewModelScope.launch {
    val data = withContext(Dispatchers.IO) { 
        performNetworkRequest() 
    }
    updateUI(data)
}
  1. RxJava - с subscribeOn(Schedulers.io()):
Observable.fromCallable(() -> readFile())
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(result -> updateUI(result));
  1. ThreadPoolExecutor - для ручного управления потоками.

Основные механизмы работы:

  • Ядро ОС переводит поток в состояние ожидания
  • При поступлении данных поток пробуждается и продолжает выполнение
  • В Android предпочтительно использовать асинхронные подходы, чтобы не блокировать UI