Прежде чем погрузиться в особенности потоков в React Native, важно понять, что такое потоки в целом. Итак, начнем.

Потоки в компьютерных науках: углубленное исследование

В вычислениях поток является одним из фундаментальных аспектов процесса. Проще говоря, процесс — это исполняемая программа. Процесс содержит программный код и его текущую активность, а поток — это сущность внутри процесса, которую ядро ​​операционной системы планирует для выполнения. Чтобы дать вам ментальную модель, вы можете думать о функции как о контейнере для потоков, каждый из которых работает в контейнере своим ходом.

Основы работы с потоками

Потоки также называют облегченными процессами. Это самые второстепенные единицы обработки, которые могут выполняться в операционной системе. Каждый поток связан с набором ресурсов, таких как регистры, программные счетчики и стек внутри адресного пространства процесса, которые они могут совместно использовать с другими потоками в том же процессе. Это позволяет строкам читать и записывать одни и те же структуры данных и переменные, способствуя взаимодействию между потоками.

Многопоточность

Способность операционной системы поддерживать несколько параллельных путей выполнения в рамках одного процесса называется многопоточностью. Многопоточность позволяет нескольким потокам внутри процесса совместно использовать одно и то же пространство данных, что позволяет им взаимодействовать быстрее, чем если бы они были отдельными процессами.

Многопоточность — это широко распространенный метод, используемый в современном программировании для повышения производительности, особенно в приложениях, требующих тяжелых операций ввода-вывода. Он использует возможности высокопроизводительных компьютеров и серверов для выполнения нескольких операций одновременно.

Преимущества использования потоков

Нитки популярны, потому что они имеют ряд преимуществ, таких как:

1. **Улучшенная скорость отклика**. Если поток блокируется или ожидает ответа, приложение может продолжить свою работу через другие потоки.

2. **Совместное использование ресурсов**. Потоки совместно используют память и ресурсы процесса, которому они принадлежат, что облегчает взаимодействие между ними.

3. **Экономичный**. Выделение памяти и ресурсов для создания процесса требует больших затрат. Поскольку потоки совместно используют ресурсы процесса, которому они принадлежат, их разработка и управление более экономичны.

4. **Использование многопроцессорных архитектур**. Преимущества потоков еще более заметны в многопроцессорных системах. Однопоточный процесс может выполняться только на одном ЦП, независимо от того, сколько их доступно. Многопоточность на многопроцессорной машине увеличивает параллелизм, повышая пропускную способность системы.

### вызовы с потоками

Несмотря на многочисленные преимущества, использование потоков также сопряжено с рядом проблем:

1. **Синхронизация**. Поскольку потоки используют одно и то же адресное пространство, функциональное выполнение одного потока может повлиять на производительность другого потока. Это приводит к необходимости синхронизации потоков.

2. **Взаимоблокировки**. Взаимоблокировки могут возникать, когда нескольким потокам требуется один и тот же заблокированный ресурс, что приводит к зависанию приложения.

3. **Отладка**. Отладка многопоточных программ может быть сложной задачей, поскольку разные потоки могут взаимодействовать сложным и неожиданным образом.

Несмотря на эти проблемы, потоки являются мощным инструментом для создания высокопроизводительных и быстро реагирующих приложений. Они являются фундаментальной концепцией информатики, и их понимание необходимо для продвинутого программирования, особенно в операционных системах, параллельной обработке и распределенных вычислениях.

## Теперь, когда у нас есть общее представление о том, что такое потоки, давайте углубимся в них в контексте React Native

## Глубокое погружение в различные темы в React Native

В React Native, JavaScript-фреймворке для создания мобильных приложений, есть три основных потока, о которых разработчики должны знать:

1. **Основная тема (пользовательский интерфейс)**

2. **Поток JavaScript**

3. **Обсуждение нативных модулей**

Кроме того, для Android 5.0 и более поздних версий доступен Render Thread. Каждый поток играет определенную роль в функционировании вашего приложения React Native.

### 1. Основной поток (пользовательский интерфейс)

Это основной поток, в котором создаются и обрабатываются все собственные компоненты пользовательского интерфейса. Он обрабатывает взаимодействие с пользователем, отображает компоненты пользовательского интерфейса и управляет обновлениями экрана устройства.

Каждое обновление пользовательского интерфейса React Native происходит в этом потоке. Поэтому, если вы часто манипулируете своим состоянием, этот поток может стать занятым и вызвать проблемы с производительностью.

### 2. Тема JavaScript

Приложения React Native выполняют код JavaScript в отдельном движке JavaScript, который происходит в потоке JavaScript. Сюда входят вызовы API, обработка сенсорных событий и выполнение кода JavaScript.

Это поток, в котором выполняется ваш фактический код React и JavaScript. Этот поток выполняет всю логику на стороне JS, такую ​​как вызовы API, обработку касаний и бизнес-логику.

### 3. Тема собственных модулей

React Native позволяет писать код на родных языках (таких как Java для Android и Objective-C или Swift для iOS) при выполнении задач без JavaScript. Это известно как собственный модуль, и выполнение этого собственного кода происходит в потоке Native Modules.

Если вы используете собственный код в своем приложении React Native, он выполняется здесь. Поток собственных модулей также может разгрузить тяжелые вычисления из потока JavaScript, чтобы ваше приложение оставалось отзывчивым.

### 4. Рендеринг потока (Android 5.0+)

Этот поток был представлен в Android 5.0 (Lollipop). Он отключает рендеринг основного потока для приложений, созданных для его использования. Это особенно полезно для сложных анимаций, требующих высокой частоты кадров.

## Примеры кода

React Native позволяет разработчикам выполнять код в разных потоках с помощью определенных методов. Например:

1. **Тема JavaScript**:

Здесь выполняется большая часть вашего кода JavaScript. Примером может быть установка состояния после получения данных из API.

fetchData = async () => {
const response = await fetch("https://api.example.com/data");
const json = await response.json();
this.setState({ data: json }); // this line is executed in the JavaScript thread
}

2. **Основная тема**: здесь выполняется любое взаимодействие с компонентами пользовательского интерфейса. Примером является анимация члена с помощью Animated API:

Animated.timing(this.state.fadeAnim, {
// this executes on the UI thread
toValue: 1,
duration: 2000,
}).start();

3. **Тема нативных модулей**: если вы используете нативный модуль, код будет выполняться здесь. Простым примером может быть создание модуля Toast в Android:

// This is Java code that will run on the Native Modules Thread
@ReactMethod
public void show(String message, int duration) {
Toast.makeText(getReactApplicationContext(), message, duration).show();
}

В этом примере метод `show` будет вызываться из JavaScript, но выполняться в потоке Native Modules.

Понимание этих потоков имеет решающее значение при разработке React Native, поскольку позволяет повысить производительность и скорость отклика приложения. Всегда важно помнить, что основной поток должен быть как можно более доступным, чтобы обеспечить плавное обновление пользовательского интерфейса и анимацию.

## Использование разных потоков в React Native

В приложении React Native разные потоки имеют разные роли и по-разному используются для выполнения других задач. Ниже мы рассмотрим, как используется каждый поток, и несколько примеров.

**_1. Основной поток (пользовательский интерфейс)_**

Основной поток или поток пользовательского интерфейса в первую очередь связан с визуализацией пользовательского интерфейса и реагированием на взаимодействие с пользователем. Основная роль этого потока — поддерживать плавность и отзывчивость интерфейса. Когда необходимо взаимодействие с пользователем, переходы между экранами или анимация, они выполняются в основном потоке.

Например, если вы анимируете непрозрачность компонента с помощью Animated API React Native, анимация выполняется в основном потоке:

Animated.timing(this.state.fadeAnim, {
toValue: 1,
duration: 2000,
}).start();java

В приведенном выше фрагменте кода Animated.timing обновляет непрозрачность компонента в течение двух секунд. Эта анимация происходит в основном потоке, чтобы обеспечить плавное обновление пользовательского интерфейса.

**_2. Тема JavaScript_**

Поток JavaScript — это место, где выполняется ваш код React и JavaScript. В этом потоке выполняется бизнес-логика приложения, включая вычисления JavaScript, вызовы API, управление состоянием, обработку событий касания и т. д.

Когда вы извлекаете данные из API и обновляете состояние полученными данными, вы выполняете следующие операции в потоке JavaScript:

fetchData = async () => {
const response = await fetch("https://api.example.com/data");
const json = await response.json();
this.setState({ data: json }); // these operations happen on the JavaScript Thread

Здесь вызывается функция fetchData для извлечения данных из API, и полученные данные устанавливаются в состояние компонента. Вся эта операция выполняется в потоке JavaScript.

**_3. Поток собственных модулей_**

Если в вашем приложении есть задачи, которые невозможны или неэффективны с помощью JavaScript, вы будете писать код на родных языках (Java, Kotlin, Objective-C или Swift). Это известно как собственный модуль. Выполнение этих собственных модулей происходит в потоке собственных модулей.

Например, предположим, что вы написали собственный модуль для получения номера IMEI устройства (что невозможно сделать только с помощью JavaScript). Вот как можно вызвать этот модуль из кода JavaScript:

import { NativeModules } from "react-native";
// Retrieve the IMEI number using a hypothetical native module
NativeModules.DeviceInfo.getIMEI((imei) => {
console.log(imei);
});

Собственный модуль `DeviceInfo` и его метод `getIMEI` будут выполняться в потоке собственных модулей.

**_4. Визуализация потока (Android 5.0+)_**

Поток рендеринга был представлен в Android 5.0, чтобы перенести более интенсивные вычисления рендеринга на другой поток ЦП. Это позволяет анимации работать плавно, даже если основной поток занят другими задачами. Однако использование Render Thread часто абстрагируется и управляется системой, поэтому вы, как разработчик, не можете напрямую взаимодействовать с ним в своем коде.

Таким образом, понимая роль и использование каждого потока в React Native, разработчики могут оптимизировать производительность своих приложений, скорость отклика и взаимодействие с пользователем. Это понимание помогает использовать весь потенциал платформы и создавать эффективные и надежные мобильные приложения.

\*\* Рекомендуемая книга:

- [Eloquent JavaScript] -› **_Learn JavaScript Full Guide_**

- Контроль версий с помощью Git -› **_Мощные инструменты и методы для совместной разработки программного обеспечения_**

- Прагматичный программист: **_Ваш путь к мастерству_**

**_Присоединяйтесь к нашему сообществу Discord_** Раскройте свой потенциал, присоединитесь к динамичному сообществу единомышленников и давайте формировать будущее программируем вместе. Нажмите здесь, чтобы присоединиться к нам в Discord.

**_Для консультации и наставничества обращайтесь_** [slavo.io](/contact)