マルチスレッド

GraalVMでのJavaScriptの実行では、マルチスレッドがサポートされます。スレッドを使用すれば、使用シナリオに応じて、複数のContextオブジェクトまたは複数のワーカー・スレッドを通じて、パラレルJavaScriptコードを実行できます。

JavaおよびJavaScriptによるマルチスレッド

マルチスレッドは、Javaの相互運用性のコンテキストでJavaScriptを実行する場合にサポートされます。GraalVMでサポートされているマルチスレッド実行の基本モデルは、JavaScript開発者にはよく知られたシェアナッシング型のモデルです:

  1. 任意の数のJavaScript Contextを作成できますが、それらは一度に1つのスレッドで使用する必要があります。
  2. JavaScriptオブジェクトへの同時アクセスは許可されていません: 一度に複数のスレッドからJavaScriptオブジェクトにアクセスすることはできません。
  3. Javaオブジェクトへの同時アクセスは許可されています: 任意のJavaスレッドまたはJavaScriptスレッドから任意のJavaオブジェクトに同時にアクセスできます。

JavaScript Contextには複数のスレッドから同時にアクセスすることはできませんが、同時アクセスが発生しないように、適切な同期を使用して複数のスレッドから同じContextにアクセスすることは可能です。

サンプル

GraalVM JavaScriptユニット・テストには、マルチスレッドJava/JavaScript相互作用の例がいくつか含まれています。最も重要なものでは、次の仕組みが説明されています:

  1. 複数のContextオブジェクトを複数のスレッドで実行できる
  2. 適切な同期が使用されている場合、あるスレッドによって作成されたJavaScript値を別のスレッドから使用できる
  3. 適切な同期が使用されている場合、複数のスレッドからContextにアクセスできる
  4. Java同時実行性はJavaScriptから使用できる
  5. 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アプリケーションの例がいくつか含まれています。最も重要な例では、次の仕組みが示されています:

  1. Node.jsワーカー・スレッドではJavaコードを実行できる
  2. JavaオブジェクトはNode.jsワーカー・スレッド間で共有できる
  3. JavaScriptのPromiseオブジェクトを使用すると、Javaオブジェクトを介してPromiseをワーカー・メッセージにバインドすることによって、ワーカーからのメッセージに対してawaitを実行できる