ウェブサイトのドキュメントから:
Rhino Contextオブジェクトは、実行環境に関するスレッド固有の情報を格納するために使用されます。JavaScriptを実行する各スレッドに関連付けられているコンテキストは1つだけである必要があります。
つまり、スレッド間でコンテキストを渡さないでください。実行中のスレッドで新しいコンテキストを作成するだけです。Context.enter()
スレッド内で複数回呼び出すことを心配する必要はありません。これらは事実上、内部で参照カウントされるスレッドローカル変数です。したがってContext.enter()
、同じスレッドでの呼び出しは非常に簡単です。
再びドキュメントから:
これらの呼び出しは、現在のスレッドに関連付けられたコンテキストがすでに存在する場合でも正しく機能します。そのコンテキストが返され、内部カウンターがインクリメントされます。カウンターがゼロに達したときにのみ、スレッドから関連付けが解除されます。
個人的には、このコード構造をどこでも使用しました。
Context ctx = Context.enter();
try {
// do something with the ctx
} finally {
Context.exit();
}
実際、Groovyで私はこれを一緒に泡立てました:
def withContext(Closure closure) {
Context ctx = Context.enter();
try {
closure.call(ctx);
} finally {
Context.exit();
}
}
次に、次のようなコードを渡します。
withContext { Context ctx ->
ScriptableObject scope = ctx.initStandardObjects()
// now to do work with the scope and ctx.
}
最後に1つ。スコープはコンテキストに関連付けられておらず、スレッド間で永続化/渡すことができます。