マルチスレッド
GraalVMでのJavaScriptの実行では、マルチスレッドがサポートされます。スレッドを使用すれば、使用シナリオに応じて、複数のContext
オブジェクトまたは複数のワーカー・スレッドを通じて、パラレルJavaScriptコードを実行できます。
JavaおよびJavaScriptによるマルチスレッド
マルチスレッドは、Javaの相互運用性のコンテキストでJavaScriptを実行する場合にサポートされます。GraalVMでサポートされているマルチスレッド実行の基本モデルは、JavaScript開発者にはよく知られたシェアナッシング型のモデルです:
- 任意の数のJavaScript
Context
を作成できますが、それらは一度に1つのスレッドで使用する必要があります。 - JavaScriptオブジェクトへの同時アクセスは許可されていません: 一度に複数のスレッドからJavaScriptオブジェクトにアクセスすることはできません。
- Javaオブジェクトへの同時アクセスは許可されています: 任意のJavaスレッドまたはJavaScriptスレッドから任意のJavaオブジェクトに同時にアクセスできます。
JavaScript Context
には複数のスレッドから同時にアクセスすることはできませんが、同時アクセスが発生しないように、適切な同期を使用して複数のスレッドから同じContext
にアクセスすることは可能です。
サンプル
GraalVM JavaScriptユニット・テストには、マルチスレッドJava/JavaScript相互作用の例がいくつか含まれています。最も重要なものでは、次の仕組みが説明されています:
- 複数の
Context
オブジェクトを複数のスレッドで実行できる。 - 適切な同期が使用されている場合、あるスレッドによって作成されたJavaScript値を別のスレッドから使用できる。
- 適切な同期が使用されている場合、複数のスレッドから
Context
にアクセスできる。 - Java同時実行性はJavaScriptから使用できる。
- Javaオブジェクトには複数のJavaScriptスレッドから同時にアクセスできる。
Node.jsによるマルチスレッド
GraalVM JavaScriptの基本マルチスレッド・モデルはNode.jsアプリケーションにも適用されます。Node.jsでは、JavaScriptコードをパラレルに実行するためにワーカー・スレッドを作成できますが、JavaScriptオブジェクトをワーカー間で共有することはできません。逆に、GraalVM Javaの相互運用性(Java.type()
など)を使用して作成されたJavaオブジェクトは、Node.jsワーカー間で共有できます。これにより、マルチスレッドNode.jsアプリケーションでJavaオブジェクトを共有できるようになります。
サンプル
GraalVM Node.jsユニット・テストには、マルチスレッドNode.jsアプリケーションの例がいくつか含まれています。最も重要な例では、次の仕組みが示されています: