メインコンテンツへスキップ

スレッディングモデル

注意

このドキュメントは、現在展開中の新しいアーキテクチャに関するものです。

React Native レンダラーは、レンダーパイプラインの作業を複数のスレッドに分散させます。

ここでは、スレッドモデルを定義し、レンダーパイプラインのスレッド使用状況を説明する例をいくつか示します。

React Native レンダラーはスレッドセーフになるように設計されています。高いレベルでは、フレームワークの内部で不変データ構造を使用することでスレッドセーフティが保証されています(C++ の「const correctness」機能によって強制されます)。これは、React でのすべての更新が、データ構造を更新する代わりに、レンダラーで新しいオブジェクトを作成またはクローンすることを意味します。これにより、フレームワークはスレッドセーフで同期的な API を React に公開できます。

レンダラーは2つの異なるスレッドを使用します

  • UI スレッド(メインと呼ばれることが多い):ホストビューを操作できる唯一のスレッド。
  • JavaScript スレッド:React のレンダーフェーズとレイアウトが実行される場所。

各フェーズのサポートされている実行シナリオを確認しましょう。

Threading model symbols

レンダーシナリオ

JS スレッドでのレンダー

これは、レンダーパイプラインのほとんどが JavaScript スレッドで発生する最も一般的なシナリオです。

Threading model use case one

UI スレッドでのレンダー

UI スレッドで優先度の高いイベントが発生した場合、レンダラーはすべてのレンダーパイプラインを UI スレッドで同期的に実行できます。

Threading model use case two

デフォルトまたは連続イベントの中断

このシナリオは、UI スレッドでの優先度の低いイベントによるレンダーフェーズの中断を示しています。React と React Native レンダラーは、レンダーフェーズを中断し、その状態を UI スレッドで実行される優先度の低いイベントとマージすることができます。この場合、レンダープロセスは JS スレッドでの実行を継続します。

Threading model use case three

離散イベントの中断

レンダーフェーズは中断可能です。このシナリオは、UI スレッドでの優先度の高いイベントによるレンダーフェーズの中断を示しています。React とレンダラーは、レンダーフェーズを中断し、その状態を UI スレッドで実行された優先度の高いイベントとマージすることができます。レンダーフェーズは UI スレッドで同期的に実行されます。

Threading model use case four

C++ 状態更新

UI スレッドで発生し、レンダリングフェーズをスキップする更新。詳細については、React Native レンダラーの状態更新を参照してください。

Threading model use case six